AJAX応答からバイト形式で送られてくるファイルをダウンロードしたい。
私はBolb
の助けを借りてこのようにしようとしました:
var blob=new Blob([resultByte], {type: "application/pdf"});
var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download="myFileName.pdf";
link.click();
実際にはPDFファイルをダウンロードしていますが、ファイル自体が破損しています。
どうすればこれを達成できますか?
私はずっと前に質問をしたので、いくつかの詳細が間違っているかもしれません。
Blob
には配列バッファーが必要であることがわかりました。そのため、最初にbase64バイトを配列バッファーに変換する必要があります。
これを行う関数は次のとおりです。
function base64ToArrayBuffer(base64) {
var binaryString = window.atob(base64);
var binaryLen = binaryString.length;
var bytes = new Uint8Array(binaryLen);
for (var i = 0; i < binaryLen; i++) {
var ascii = binaryString.charCodeAt(i);
bytes[i] = ascii;
}
return bytes;
}
ここにpdfファイルを保存するための私の機能があります:
function saveByteArray(reportName, byte) {
var blob = new Blob([byte], {type: "application/pdf"});
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
var fileName = reportName;
link.download = fileName;
link.click();
};
これら2つの関数を一緒に使用する方法は次のとおりです。
var sampleArr = base64ToArrayBuffer(data);
saveByteArray("Sample Report", sampleArr);
1行追加するだけで機能します。応答はサーバーアプリケーションからのバイト配列です
var bytes = new Uint8Array(resultByte); // pass your byte response to this constructor
var blob=new Blob([bytes], {type: "application/pdf"});// change resultByte to bytes
var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download="myFileName.pdf";
link.click();
Blob
ではなくtype
コンストラクターでBlob
createObjectURL
を設定します
var blob = new Blob([resultByte], {type: "application/pdf"});
var link = document.createElement("a");
link.href = window.URL.createObjectURL(blob);
link.download = "myFileName.pdf";
link.click();