问题 在带有angularjs的Internet Explorer中的Blob网址


鉴于此代码(来自其他人):

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安全设置或正在进行的操作?


2608
2017-12-12 02:35


起源

IE不支持所有blob mime类型,你是否尝试使它只是纯文本,看看是否有效? - joseeight
我有同样的问题,我已经尝试过了 text/plain,无济于事。有趣的是,我可以右键单击,将目标另存为,并且可以正常工作。 - bhamlin


答案:


为此找到了解决方案。首先,IE以不同方式处理blob,特别是它使用:

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

如果你看一下源代码 这一页,你会看到他们是如何做到的。

但是要让它与跨浏览器支持一起使用是一件痛苦的事情......并且最终会结束 使用FileSaver.js

..这是我最终使用的,并且像一个魅力。


16
2018-01-08 01:21



我可以遵守这项工作。 IE / ROW的条件如下: // IE 10 / 11 if (window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob(blob, fileName); } else { ... - vanthome
很好找。我正打算疯狂地看着浏览器对比图表。 - Casey


使用 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特定代码的示例。 (跨浏览器的岩石)


0
2017-11-18 21:56