web-dev-qa-db-ja.com

バイト配列をJavaScript / Extjsのファイルとしてファイルダウンロード

私のExt Jsソリューションでは、このJSON形式を返すサービスを呼び出しています

{"success":true,"filename":"spreadsheet.xlsx","file":[80,75,3,4,20,0,...(many more)]}

ファイルダウンロードダイアログをファイル名とバイト配列(ファイル)の内容でどのように作成できますか?

更新

だから私はこのビットがダウンロードを始めるのを見つけました

var a = window.document.createElement('a');
                    a.href = window.URL.createObjectURL(new Blob(data.file, { type: 'application/octet-stream' }));
                    a.download = data.filename;

                    // Append anchor to body.
                    document.body.appendChild(a)
                    a.click();

                    // Remove anchor from body
                    document.body.removeChild(a)

これまでのところ良い

しかし、取得したファイルが破損しているので、ファイル変数をエンコード/デコードする必要があると思いますか?

12
Jepzen

ファイルをBlobに渡す前に、ファイルをUint8Arrayに変換する必要がありました

var arr = data.file;
var byteArray = new Uint8Array(arr);
var a = window.document.createElement('a');

a.href = window.URL.createObjectURL(new Blob([byteArray], { type: 'application/octet-stream' }));
a.download = data.filename;

// Append anchor to body.
document.body.appendChild(a)
a.click();


// Remove anchor from body
document.body.removeChild(a)

この回答を読むことは大いに役立ちました https://stackoverflow.com/a/16245768/1016439

26
Jepzen

Jepzenの応答に基づいて、私はこの手法を使用して、ブラウザー内からAWS S3からドキュメントをダウンロードすることができました。 +1ジェプゼン

s3.getObject(params, function(err, data) {
      if (err === null) {
         var arr = data.Body;
         var byteArray = new Uint8Array(arr);
         var a = window.document.createElement('a');

         a.href = window.URL.createObjectURL(new Blob([byteArray], { type: 'application/octet-stream' }));
         a.download = fName; //fName was the file name portion of the key what was passed in as part of the key value within params. 

         // Append anchor to body.
         document.body.appendChild(a)
         a.click();

         // Remove anchor from body
         document.body.removeChild(a)
      } else {
        result = 'failure'
         console.log("Failed to retrieve an object: " + err);
      }
});
   
1
scoDubblT