2017-03-13 10 views
0

私はいくつかのコードを持っているが、サーバによって生成されるべきである。データダウンロード用のポリフィルがありますか?

<a download="test.csv" href="data:text/plain;charset=utf-8;base64,w4FydsOtenTFsXLFkXTDvGvDtnJmw7p0w7Nnw6lwLg=="> 
    teszt 
</a> 

それは現在のクロム、Firefoxの、オペラで動作します。私はMSIE11をサポートしたいと思います。 Afaik msSaveBlobはその解決策です。私が使用できる既存のjs polyfillはありますか?それを書かなければなりませんか?

答えて

1

私はSO答えとhereで見つけたコードに基づいて単純なポリフィルを作成しました。私はMSIE11でそれをテストしました。 XHRでファイルのダウンロードをサポートしていません。データURIだけです。ファイルを強制的にダウンロードする場合は、代わりにContent-Dispositionレスポンスヘッダーを使用することをお勧めします。私の場合、サーバーはファイルを作成するだけですが、ファイルを保存してはならず、HTML応答も必要でした。別の解決策は、電子メールでファイルを送信することですが、私は小さなファイルでこれをより良く見つけました。要旨作成し

(function(){ 

    addEvent(window, "load", function(){ 
     if (isInternetExplorer()) 
      polyfillDataUriDownload(); 
    }); 

    function polyfillDataUriDownload(){ 
     var links = document.querySelectorAll('a[download], area[download]'); 
     for (var index = 0, length = links.length; index<length; ++index) { 
      (function (link){ 
       var dataUri = link.getAttribute("href"); 
       var fileName = link.getAttribute("download"); 
       if (dataUri.slice(0,5) != "data:") 
        throw new Error("The XHR part is not implemented here."); 
       addEvent(link, "click", function (event){ 
        cancelEvent(event); 
        try { 
         var dataBlob = dataUriToBlob(dataUri); 
         forceBlobDownload(dataBlob, fileName); 
        } catch (e) { 
         alert(e) 
        } 
       }); 
      })(links[index]); 
     } 
    } 

    function forceBlobDownload(dataBlob, fileName){ 
     window.navigator.msSaveBlob(dataBlob, fileName); 
    } 

    function dataUriToBlob(dataUri) { 
     if (!(/base64/).test(dataUri)) 
      throw new Error("Supports only base64 encoding."); 
     var parts = dataUri.split(/[:;,]/), 
      type = parts[1], 
      binData = atob(parts.pop()), 
      mx = binData.length, 
      uiArr = new Uint8Array(mx); 
     for(var i = 0; i<mx; ++i) 
      uiArr[i] = binData.charCodeAt(i); 
     return new Blob([uiArr], {type: type}); 
    } 

    function addEvent(subject, type, listener){ 
     if (window.addEventListener) 
      subject.addEventListener(type, listener, false); 
     else if (window.attachEvent) 
      subject.attachEvent("on" + type, listener); 
    } 

    function cancelEvent(event){ 
     if (event.preventDefault) 
      event.preventDefault(); 
     else 
      event.returnValue = false; 
    } 

    function isInternetExplorer(){ 
     return /*@[email protected]*/false || !!document.documentMode; 
    } 

})(); 
+0

:https://gist.github.com/inf3rno/0fef3495ab32f44b1c27fada672f0aafを私はループ内でクロージャを使用した理由私はわからないが、私はそれが目的を持っていると思います。 – inf3rno

関連する問題