12

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

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 安全设​​置需要更改或发生了什么?

4

2 回答 2

17

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

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

如果您查看此页面的源代码,您会看到他们是如何做到的。

但是要让它与跨浏览器支持一起工作是一件痛苦的事情。一天结束时,你最终会得到 FileSaver.js

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

于 2014-01-08T01:21:02.193 回答
1

使用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 特定代码。(跨浏览器摇滚)

于 2016-11-18T21:56:54.567 回答