2013-12-12 25 views
9

Với mã này (từ người khác):Blob url trong internet explorer với 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 hoạt động tốt để tải về trong chrome. Nhưng việc nhấp vào liên kết 'tải xuống' sẽ không làm gì trong IE11. Không có lỗi, không cảnh báo, không có phản ứng gì cả.

Nhưng theo this nó được hỗ trợ trong IE10 và 11.

Có một số thiết lập bảo mật IE mà cần phải được thay đổi hoặc những gì đang xảy ra?

+0

IE không hỗ trợ tất cả các loại mime blob, bạn đã thử biến nó thành văn bản thuần túy và xem liệu nó có hoạt động không? – joseeight

+0

Tôi có cùng một vấn đề, và tôi đã thử nó với 'text/plain', không có kết quả. Thật thú vị, tôi có thể nhấp chuột phải, lưu mục tiêu và hoạt động. – bhamlin

Trả lời

13

Tìm thấy giải pháp cho việc này. Đầu tiên, IE xử lý lưu trữ blob khác nhau, cụ thể là nó sử dụng:

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

Nếu bạn nhìn vào mã nguồn cho this page, bạn sẽ thấy cách thực hiện.

Nhưng để làm việc này với hỗ trợ trình duyệt chéo là một nỗi đau .. và vào cuối ngày, bạn sẽ kết thúc with FileSaver.js.

.. đó là những gì tôi đã kết thúc bằng cách sử dụng và hoạt động như một sự quyến rũ.

+2

Tôi có thể tuân thủ tác phẩm này. Tôi có các điều kiện sau đây nếu điều kiện cho IE/ROW: '// IE 10/11 nếu (window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob (blob, fileName); } else { ... ' – vanthome

+0

Tìm tốt. Tôi chuẩn bị lái xe điên rồ nhìn vào biểu đồ so sánh trình duyệt. – Casey

0

Sử dụng FileSaver.js! Rất dễ sử dụng.

Đối với PDF gửi như phản ứng nhị phân:

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

Đối với phiên bản 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); 

trình như một say mê, qua trình duyệt.

Nhờ @Nicros để trỏ filesaver.js ra trong câu trả lời của mình. Tôi đã thực hiện câu trả lời này để người dùng có thể nhanh chóng sao chép và dán một ví dụ về nó, những người không muốn sử dụng mã MS cụ thể. (Đá đa trình duyệt)

Các vấn đề liên quan