Загрузите файл IE

Используя следующие строки кода, я могу загрузить файл в ответ на вызов Ajax в Firefox, Chrome, Opera. Однако в IE атрибут href download не поддерживается. Поэтому ниже в IE не работает.

HTML:

 <div class="fRight" style="margin-left:5px; margin-rigth:5px" >
    <input type="button" value="Request File"  id = "chReqFileBtn"  onclick = "handleClick"/>
    <a href="#" id="challengeReqFileAnchor" style="visibility: hidden"></a>
 </div>

JavaScript:

function handleClick()
{
    var code = $('#code').val();
    var quantity = $('#quantity').val();

    var req = $.ajax(
    {
        'type': 'POST',
        'url' : $apiBasePath+'config/challenge-file',
         contentType : 'application/json',
        'data': JSON.stringify({'code':code, 'quantity':quantity}),
        'success':function(response, status, xhr)
        {
            var code = xhr.getResponseHeader('Operation-Code');

            var anch = $('#challengeReqFileAnchor');
            anch.attr(
            {
                "download" : 'request.bin',
                "href" : "data:text/plain," + response       
            });
            anch.get(0).click();
        },
        'error': function(request,status,errorThrown) 
        {
           ......
        }
    });
    $pendingReqs.push(req);  
}

Какие варианты я должен был бы выполнить с тем же самым поведением в IE?

Ответ 1

Атрибут загрузки НЕ поддерживается в IE и iOS Safari

enter image description here

IE & л; 10:

Команда SaveAs, использующая execCommand, может добиться цели, сделав содержимое элемента загружаемым.

Минусы:

  • Проблемы в некоторых версиях IE, работающих на Win7 [не знаю, исправлено ли это здесь]
  • Нужен элемент DOM для хранения данных

IE> = 10

Используя msSaveBlob, это метод, который позволяет сохранить Blob или File, отправив следующие заголовки:

Content-Length: <blob.size>
Content-Type: <blob.type>
Content-Disposition: attachment;filename=<defaultName>
X-Download-Options: noopen

Проверьте локальное сохранение файлов с помощью Blob и msSaveBlob

Минусы:

  • Нужно определить Blob

Другие браузеры

Если вы не хотите реализовывать все это самостоятельно, есть хорошая библиотека FileSaver.js для сохранения сгенерированных файлов на стороне клиента. Он поддерживает Firefox, Chrome, Chrome для Android, IE 10+, Opera и Safari. Для IE & lt; 10 есть ветвь библиотеки, которая добавляет saveTextAs для сохранения текстовых файлов (.htm,.html,.txt)

Решение для кросс-браузеров

Сценарий на стороне сервера, который получает имя файла, данные, тип мема и затем отправляет файл с заголовком Content-Disposition: attachment; filename=FILENAME

Ответ 2

Я думаю, что это связано с anch.get(0).click();, не поддерживаемым всеми браузерами специально для привязок hidden, поэтому вместо этого вы можете попробовать следующий код,

anch.get(0).show().focus().click().hide();

Ответ 3

IE не поддерживает ни навигацию к URI данных, ни атрибут download. Вы можете использовать navigator.msSaveBlob для сохранения файла для IE 10+.
Вы можете проверить window.navigator.msSaveBlob и написать код, специфичный для IE, иначе использовать существующий код для сохранения файла.
Вы можете проверить следующую ссылку: Сохранение файлов локально с помощью Blob и msSaveBlob

Ответ 4

IE не поддерживает тег download.

Там есть уродливый взлом, который вы можете использовать.

  • Создайте невидимый iframe:

    <iframe id="dummy" style="display:none; visibility:hidden"></iframe>
    
  • Напишите свои данные в iframe document:

    var ifd = document.getElementById('dummy').contentDocument;
    ifd.open('text/plain', 'replace');
    ifd.write('whatever you want to be in the file');
    ifd.close();
    
  • Используйте execCommand, чтобы сохранить файл (на самом деле, чтобы вызвать диалог сохранения):

    ifd.execCommand('SaveAs', true, 'request.bin');
    

Обратите внимание, что execCommand не работает в IE11. Я знаю, что почти невозможно обнаружить браузер совершенно правильно. Однако вы можете попробовать это как подпрограмму резервного копирования, если сбой файла в вашем коде.

Ответ 5

Моя версия JavaScript для загрузки файла из IE11 с спецификацией и набором символов для Excel:

$.post('/cup-frontend/requestthewholelist',
    {ipAddressList: validIpAddressListAsString},   // add custom http variables
    function (returnedData) {                      // success return
        var BOM = "\uFEFF";                        // byte order mark for excel

        if (navigator.msSaveBlob) {                // ie block
            console.log("found msSaveBlob function - is't IE")
            var blobObject = new Blob([BOM + returnedData], {type: ' type: "text/csv; charset=utf-8"'});
            window.navigator.msSaveOrOpenBlob(blobObject, "cup_database.csv");
        }
        else {                                     // non-ie block
            console.log("not found msSaveBlob function - is't not IE")
            var a = window.document.createElement('a');
            a.setAttribute('href', 'data:text/plain; charset=utf-8,' + encodeURIComponent(BOM + returnedData));
            a.setAttribute('download', 'example.csv');
            a.click();
        }

    }).fail(function () {
    console.log('post error')
});

Ответ 6

Наконец, после нескольких часов исследований я нашел ответ, который действительно работал для меня. Следующий подход работал для меня.

if (navigator.msSaveBlob) { // For IE
   return navigator.msSaveBlob(blobObj, fileName);
}

В нижней строке

navigator.msSaveBlob(blobObj, fileName)

функция msSaveBlob сохраняет файл на диск. Параметр blobObj - это объект, который необходимо сохранить с заданным именем в параметре fileName

Для получения дополнительной информации, пожалуйста, посетите следующую ссылку: MDN Webdocs Mozilla