2013-12-12 9 views
9

diesen Code Given (von jemand anderem):Blob-URL im Internet Explorer mit 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(); 
      }); 
     } 
    }; 
}); 

The fiddle example funktioniert gut in Chrom zum Download bereit. Durch Klicken auf den Link "Download" wird in IE11 jedoch nichts unternommen. Kein Fehler, keine Warnung, keine Antwort.

Aber nach this ist es in IE10 unterstützt und 11.

Gibt es eine IE-Sicherheitseinstellung, die geändert werden muss oder was ist hier los?

+0

IE unterstützt nicht alle Blob Mime-Typen, haben Sie versucht, es einfach nur Text und sehen, ob das funktioniert? – joseeight

+0

Ich habe das gleiche Problem, und ich habe es mit 'text/plain' versucht, vergebens. Interessanterweise kann ich mit der rechten Maustaste klicken, Ziel speichern, und das funktioniert. – bhamlin

Antwort

13

Eine Lösung dafür gefunden. Zuerst behandelt IE blob Spar anders, und zwar verwendet er:

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

Wenn Sie this page auf den Quellcode schauen, sehen Sie, wie sie es tun.

Aber um dies mit Cross-Browser-Unterstützung zu arbeiten ist ein Schmerz .. und am Ende des Tages werden Sie am Ende with FileSaver.js.

..das ist, was ich am Ende verwendet habe, und funktioniert wie ein Charme.

+2

Ich kann das anpassen funktioniert. Ich habe folgende Bedingungen für IE/ROW: '// IE 10/11 if (window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob (Blob, Dateiname); } sonst { ... ' – vanthome

+0

Nice find. Ich war dabei, mich selbst verrückt zu machen, indem ich Browservergleichsdiagramme betrachtete. – Casey

0

Verwenden Sie FileSaver.js! So einfach zu bedienen.

Für PDF als binäre Antwort gesendet:

// 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); 

Für NPM Version:

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); 

Arbeiten wie ein Charme, Cross-Browser.

Dank @Nicros für das Zeigen von Dateiserver.js in seiner Antwort. Ich habe diese Antwort gemacht, damit Benutzer schnell ein Beispiel kopieren und einfügen können, die nicht MS-spezifischen Code verwenden möchten. (Cross-Browser-Felsen)