1. ホーム
  2. Web制作
  3. html5

HTML5 Blobによるファイルダウンロード機能のサンプルコード

2022-01-14 01:44:41

原理は、実際には非常に簡単ですが、バイナリにBlobの助けを借りて、テキストまたはJS文字列情報(つまり、背景には、サーバー上の特定のパスなしで動的ファイルに、エクスポートデータ機能などを返します)、次に、ダウンロード属性とタグのhref属性として、ダウンロード機能を実現するには、欠点は、ファイルが大きすぎると、失敗をダウンロードしている場合です。

データのエクスポートの例です。

$("#exportAll").on("click",function(){ //click [export all])
    //layer.load();
    var province = $('#operatingData select[name=\'province\'] option:selected').val(); //query condition (province)
    var city = $('#operatingData select[name=\'city\'] option:selected').val(); //query condition (city)

    var url = '/xxx/excelAllDownload'; //[export all] request url
    var xhr = new XMLHttpRequest();
    xhr.open('POST', url, true);
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    xhr.responseType = "blob"; //return type blob
    xhr.onload = function () { //define the request completion handler
        //layer.closeAll('loading');
        if (this.status === 200) {
            var blob = this.response;
            var reader = new FileReader();
            reader.readAsDataURL(blob); // convert to base64, can be put directly into a tag href
            reader.onload = function (e) {
                var a = document.createElement('a'); // conversion complete, create an a tag for downloading
                a.download = 'XX data.xlsx';
                a.href = e.target.result;
                $("body").append(a); // Fix the inability to trigger the click in firefox
                a.click();
                $(a).remove();
            }
        }else if(this.status === 504){
            alert('Export failed, request timed out');
            //layer.msg('Export failed, request timed out', {icon: 2});
        }else{
            alert('Export failed');
            //layer.msg('Export failed', {icon: 2});
        }
    };
    xhr.send("province=" + province + "&city=" + city);
})


上記は、エクセルファイルがサーバーによって動的に生成される場合に使用されるダウンロード方法で、対応するURLが存在しないため、単純にhref属性を指定することができないからです。

しかし、ブラウザによってBlob(ファイルのようなもの)のサイズ制限が異なり、Blobをバイナリに変換してダウンロードするこの方法では、あまり多くのデータをエクセルにエクスポートできない(つまり、大きすぎるファイルをダウンロードできない)し、互換性の問題もあるのだそうです。

つまり、JavaScriptでサーバーにリクエストを行い、ファイルを生成するように指示し、対応するURLをクライアントに返せばいいわけです。コードは以下のようになります(リクエストの結果は、サーバー上に既に存在する静的ファイルへのパスです)。

$("#exportAll").on("click",function(){ //click [export all])
    var url = '/xxx/excelAllDownload'; //[exportAll] request url
    var xhr = new XMLHttpRequest();
    xhr.open('POST', url, true);
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    xhr.responseType = "blob"; //return type blob
    xhr.onload = function () { //define the request completion handler
        if (this.status === 200) {
            //Way one implements static file download, can't customize download file name
            //location.href = "json/abc.xlsx"; //this.response (the path to the static file returned on the server)

            // way two to achieve a static file download, you can customize the download file name
            var a = document.createElement('a'); //create a tag for downloading
            a.download = 'XXX data.xlsx';
            a.href = "json/abc.xlsx"; //this.response (the path to the static file on the returned server)
            $("body").append(a); // Fix the inability to trigger the click in firefox
            a.click();
            $(a).remove();
        }else if(this.status === 504){
            alert('Export failed, request timed out');
        }else{
            alert('Export failed');
        }
    };
    xhr.send();
})



以上、本記事の全内容をご紹介しましたが、皆様の学習のお役に立てれば幸いです。また、Script Houseをより一層ご支援いただければ幸いです。