JavaScript-如何在JSON中接收字節數組

我試圖從服務器接收一個將包裝在JSON中的pdf。

如果我只是將pdf的字節數組發送到前端,我可以通過設置responseType來正確讀取它arraybuffer,然後我可以通過以下方式下載pdf:

var blob = new Blob([data], { type: application/pdf});
if ($window.navigator && $window.navigator.msSaveOrOpenBlob) {
$window.navigator.msSaveOrOpenBlob(blob);
} else {
var a = document.createElement("a");
document.body.appendChild(a);
var fileURL = URL.createObjectURL(blob);
a.href = fileURL;
a.download = fileName;
a.click();
}
}

但是當服務器嘗試發送帶有bytearray的JSON時,如果我設置為responseTypeto JSON,那麼我將無法轉換blob。但是,如果我設置responseType為arrayBuffer,我將獲得一個arrayBuffer數組,如何將其轉換為JSON,同時仍然能夠提取pdf:

我收到的JSON格式如下:

{
result: true,
value: ,
errorMessage: null
}

如果假設下面的變量代表responseText的結構:

responseText = {
result: true,
value: ,
errorMessage: null

}

然後,responseText.value是字節數組。如果字節數組已經被輸入為Uint8Array,那麼這將起作用。(注意:存在其他類型數組,因此請選擇最適合您情況的數組):

var blob = new Blob([response.value], { type: 'application/pdf'});
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(blob);
} else {
var a = document.createElement("a");
document.body.appendChild(a);
var fileURL = URL.createObjectURL(blob);
a.href = fileURL;
a.download = 'test';//filename
a.click();
}

但是,如果有一個像下面這樣的字節的字符串數組或整數數組: responseText.value = [145, 229, 216, 110, 3]並且它需要轉換為類型化的字節數組,那麼下面的代碼將起作用:

var ba = new Uint8Array(responseText.value);

要麼,

var ba = new Uint8Array([145, 229, 216, 110, 3]);

因此,

var blob = new Blob([ba], { type: 'application/pdf'}); 

這樣,字節數組可用於創建blob,因此在click事件觸發時下載文件。


分享到:


相關文章: