先端はどのようにファイルのダウンロード機能を実現しますか?
13897 ワード
記事の目次フロントエンドはどうやってファイルダウンロード機能を実現しますか? バックエンドと組み合わせて を実現します.二つの実施形態 第1種、サーバの静的リソースを直接ダウンロードする 第二種類、フロントエンドの参照、バックエンドの生成ファイル 実現構想: 長所短所 メリット 欠点 純先端 を実現しました.データソース 構想を実現します. 第1ステップは、データを対応`data:URLs`または`blob:URL` に生成する.生成`data:URLs` `BlobURLs` を生成する.第二ステップ、処理ダウンロード(またはエクスポート)方式 長所短所 メリット 欠点 先端はどのようにファイルのダウンロード機能を実現しますか?
どのようにファイルダウンロード機能を実現するかについては、実現された技術方式によって2つの種類に分けられます.バックエンドと組み合わせて を実現します.純先端 を実現しました.
バックエンドと結合して実現
二つの実現方式
第一種類、直接サーバーの静的リソースをダウンロードします.
この方法で一番簡単なのはaラベルを使うことです.
第二種類、フロントエンドの参照、バックエンドの作成ファイル
実現の考え方:
1、フロントエンドはデータまたはパラメータを送信してバックエンドに送る
2、バックエンドで受信したデータからファイルを生成したり、パラメータに基づいて対応するデータを検索してファイルを生成しています.
3、その後、応答要求ヘッダに設定する
4、ブラウザは応答ヘッダを受信するとダウンロード動作をトリガします.
長所と短所
長所は、パラメータに応じて異なるファイルを生成することができ、柔軟性が高い .は、大データ量または大ファイルのダウンロードを実現することができます.
欠点 ダウンロードが必要なのは、ユーザが生成したコンテンツ(オンライン作図など)またはコンテンツがすでにクライアントに戻っている場合、リソースと帯域幅の浪費を招く である.
フロントエンドのみ実現
純粋なフロントエンドの実現にはバックエンドが必要ではないが、バックエンドのデータがフロントエンドに渡されている場合があります.ユーザーがダウンロードしたファイルの内容は既存のデータだけが必要です.この場合、フロントエンドを使用してファイルをダウンロードする機能を実現し、サーバーリソースと帯域幅の浪費を低減することができます.
データソース
1、バックエンドの戻り
2、ユーザー入力:オンライン作図、オンライン表入力
構想を実現する
二段階に分ける:
第1のステップは、データ生成ペア
第1のステップは、データ生成ペア
省略されると、デフォルト値は
どのようにデータを
最初の種類は、テキストの種類に対して、直接データをつなぎ合わせることができます.
例
例
例
例
第二ステップ、処理ダウンロード(またはエクスポートと呼ぶ)方式
第1の、
例
長所サーバリソースと帯域幅を減らす 先端だけが必要で、先端の制御性が増加しました.
欠点 大データ量に対するサポート度が良くないです. 互換性の問題があります.
どのようにファイルダウンロード機能を実現するかについては、実現された技術方式によって2つの種類に分けられます.
バックエンドと結合して実現
二つの実現方式
第一種類、直接サーバーの静的リソースをダウンロードします.
この方法で一番簡単なのはaラベルを使うことです.
<a href="URL">a>
他の方法は、form
、iframe
、location.href
、window.open()
、Content-disposition
のように、ここでは詳しく説明しない.第二種類、フロントエンドの参照、バックエンドの作成ファイル
実現の考え方:
1、フロントエンドはデータまたはパラメータを送信してバックエンドに送る
2、バックエンドで受信したデータからファイルを生成したり、パラメータに基づいて対応するデータを検索してファイルを生成しています.
3、その後、応答要求ヘッダに設定する
Content-disposition:attachment;filename="fliename.fileType"
ファイルタイプ、ファイル名、ファイルコードなどの指定に使用します.MIME
(コンテンツ・展開)はMIME
プロトコルタイプの拡張であり、MIME
プロトコルは、data:URLs
ユーザエージェントが追加ファイルをどのように表示するかを示す.4、ブラウザは応答ヘッダを受信するとダウンロード動作をトリガします.
長所と短所
長所
欠点
フロントエンドのみ実現
純粋なフロントエンドの実現にはバックエンドが必要ではないが、バックエンドのデータがフロントエンドに渡されている場合があります.ユーザーがダウンロードしたファイルの内容は既存のデータだけが必要です.この場合、フロントエンドを使用してファイルをダウンロードする機能を実現し、サーバーリソースと帯域幅の浪費を低減することができます.
データソース
1、バックエンドの戻り
2、ユーザー入力:オンライン作図、オンライン表入力
構想を実現する
二段階に分ける:
第1のステップは、データ生成ペア
blob:URLs
またはdata:URLs
第二ステップ、処理ダウンロード(またはエクスポートと呼ぶ)方式第1のステップは、データ生成ペア
blob:URL
またはdata:URLs
生成data: URLs
data:
は、プレフィックスURL
のmediatype
文字列であり、フォーマットはdata:[<mediatype>][;base64],<data>
MIME , "image/jpeg
JPEG
は「text/plain;charset=US-ASCII
画像ファイルを示す.省略されると、デフォルト値は
data:URLs
です.どのようにデータを
window.btoa()
に変換しますか?最初の種類は、テキストの種類に対して、直接データをつなぎ合わせることができます.
例
const dataURL = `data:text/plain;base64,` + textData
第二の方法は、btoa()
を通じてFileReader.readAsDataURL(blob)
関数は、バイナリデータの「文字列」をbase-64符号化ASCII文字列に作成します.例
let str = new Blob(['some thing'])
console.log(btoa(str)) // W29iamVjdCBCbG9iXQ==
let dataURL = 'data:text/plain;base64,' + btoa(str) // data:text/plain;base64,W29iamVjdCBCbG9iXQ==
第三の方法は、File
を通じてBlob
またはFileReader.readAsDataURL()
オブジェクトについては、data:URLs
の方法を用いてBlobURLs
に変換することができる.例
const blob = new Blob(['some thing'])
const reader = new FileReader()
reader.onloadend = function() {
const dataUrl = is_chrome_ios
? reader.result
: reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;')
}
reader.readAsDataURL(blob)
生成blob: URLs
URL.createObjectURL()
は、DOMString
静的方法によって生成されたURL
であり、パラメータに与えられたオブジェクトを表すURL.createObjectURL()
が含まれる.File
方法は、Blob
またはblobURLs
オブジェクトしか処理できないので、blob
を生成するには、file
オブジェクトまたはBlobURLs
オブジェクトにデータを変換しなければならない.例
File Blob
const blob = new Blob([data][, MIMEType])
BlobURLs
const BlobURL = URL.createObjectURL(blob)
作成されたURL.revokeObjectURL()
は手動で
を呼び出して廃棄する必要があります.そうでないと、ページが閉じられます.最適な性能とメモリの使用状況を得るために、安全なタイミングで自発的にそれらを解放してください.第二ステップ、処理ダウンロード(またはエクスポートと呼ぶ)方式
第1の、
download
タグのhref
および
download
タグのHTML5
は、ブラウザがURLにナビゲーションしているのではなく、URL
規格で追加された属性であるため、ユーザに対してローカルファイルとして保存するように促すことになる.また、download
属性の値は、ダウンロードファイルの名前を指定することができる.href
は、dataURLs
およびblobURLs
の2つのタイプの値をサポートする.例
<a download="filename" href="dataURLs BlobURLs">a>
第二の種類、location.href
またはwindow.open()
この方法は、直接DataURLs
またはBlobURLs
をブラウザのアドレスにアップロードしてダウンロードをトリガする方法である.window.location.href = urls; //
window.open(urls, '_blank'); //
第三種類、msSaveOrOpenBlob(IE10+)
これはIE
特有の方法です.navigator.msSaveOrOpenBlob(blob, fileName);
第四種類、iframe(IE <= 9)
他のより現代的なブラウザもこの方法をサポートしていますが、この方法は効率と安全性が低いので、一般的にはIE <= 9
の時にのみ使用されます.var frame = document.createElement("iframe");
if ( frame ) {
document.body.appendChild(frame);
frame.setAttribute("style", "display:none");
frame.contentDocument.open("txt/html", "replace");
frame.contentDocument.write(data); // data string
frame.contentDocument.close();
frame.focus();
frame.contentDocument.execCommand("SaveAs", true, filename);
document.body.removeChild(frame);
}
長所と短所長所
欠点