web-dev-qa-db-ja.com

JavaScriptのバイトからファイルをダウンロードする

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ファイルをダウンロードしていますが、ファイル自体が破損しています。

どうすればこれを達成できますか?

40

私はずっと前に質問をしたので、いくつかの詳細が間違っているかもしれません。

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);
92

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();
8
KrishnaSingh

BlobではなくtypeコンストラクターでBlobcreateObjectURLを設定します

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();
0
guest271314