URL-адрес блоба в Internet Explorer с angularjs

Учитывая этот код (от кого-то еще):

var module = angular.module('myApp', []);

module.controller('MyCtrl', function ($scope){
    $scope.json = JSON.stringify({a:1, b:2});
});

module.directive('myDownload', function ($compile) {
    return {
        restrict:'E',
        scope:{ data: '=' },
        link:function (scope, elm, attrs) {
            function getUrl(){
                return URL.createObjectURL(new Blob([JSON.stringify(scope.data)], {type: "application/json"}));
            }

            elm.append($compile(
                    '<a class="btn" download="backup.json"' +
                    'href="' + getUrl() + '">' +
                    'Download' +
                    '</a>'
            )(scope));                    

            scope.$watch(scope.data, function(){
                elm.children()[0].href = getUrl();
            });
        }
    };
});

Пример скрипта отлично работает для загрузки в Chrome. Но нажатие на ссылку "скачать" ничего не делает в IE11. Нет ошибки, нет предупреждения, нет ответа вообще.

Но в соответствии с этим он поддерживается в IE10 и 11.

Есть какие-то настройки безопасности IE, которые нужно изменить или что происходит?

2 ответа

Решение

Нашел решение для этого. Во-первых, IE по-разному обрабатывает сохранение BLOB-объектов, в частности:

window.navigator.msSaveOrOpenBlob(new Blob([element], {type:"text/plain"}), "filename.txt");`

Если вы посмотрите на исходный код этой страницы, вы увидите, как они это делают.

Но заставить его работать с кросс-браузерной поддержкой - это боль... и в конце концов вы получите FileSaver.js.

... то, что я в конечном итоге использовал, и работает как шарм.

Используйте FileSaver.js! Так легко в использовании.

Для PDF, отправленного в виде двоичного ответа:

// In HTML, first include filesaver.js with <script src="/scripts/filesaver.js"></script>

var thisPDFfileName = 'my.pdf';
var fileData = new Blob([response], { type: 'application/pdf' });

// Cross-browser using FileSaver.js
saveAs(fileData, thisPDFfileName);

Для версии NPM:

var fileSaver = require('file-saver');

var thisPDFfileName = 'my.pdf';
var fileData = new Blob([response], { type: 'application/pdf' });

// Cross-browser using FileSaver.js
fileSaver.saveAs(fileData, thisPDFfileName);

Работает как шарм, кросс-браузер.

Спасибо @Nicros за указание файла filesaver.js в своем ответе. Я сделал этот ответ, чтобы пользователи могли быстро скопировать и вставить пример, не желая использовать код, специфичный для MS. (Кросс-браузерная порода)

Другие вопросы по тегам