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をより一層ご支援いただければ幸いです。
関連
-
404の実装で雪見だいふくをする方法CANVAS
-
モバイルHTML5入力に関するFAQ(要約)
-
amazeuiのツリーノード自動展開パネルの実装と、最初のツリーノードの選択
-
Html5によるマンドモバイル活用の甌穴(おうけつ)踏査
-
印刷用のクリア画像を生成するhtml2canvasのサンプルコード
-
高さ調整可能なテキストエリアを作成するサンプルコード
-
IOSキーボードがfocusoutイベントでしまわれたときに元の場所に戻らない問題を解決する
-
window.openがブラウザにブロックされている場合の解決策を詳しく説明します。
-
HTML5 における dialog 要素のテイスト
-
canvasで心電図を描画するサンプルコード
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン