axios請求設(shè)置responseType為'blob'或'arraybuffer'下載時如何正確處理返回值
問題:
調(diào)用后臺圖片接口,后臺返回二進制流圖片數(shù)據(jù)格式。前端接收到流后處理數(shù)據(jù)顯示在img標(biāo)簽。
解決:
1、設(shè)置axios接收參數(shù)格式為"arraybuffer":
responseType: 'arraybuffer'
2、轉(zhuǎn)換為base64格式圖片數(shù)據(jù)在img標(biāo)簽顯示:
return 'data:image/png;base64,' + btoa(
new Uint8Array(res.data).reduce((data, byte) => data + String.fromCharCode(byte), '')
);
返回的string直接放在img標(biāo)簽src可直接顯示
設(shè)置axios接收參數(shù)格式為"blob":
axios.post( ExportUrl, Params, {
responseType: 'blob'
})
.then(function(response) {
this.url = window.URL.createObjectURL(new Blob([response.data]));
});
通過a標(biāo)簽下載文件
const url = '下載的url鏈接';
const link = document.createElement('a');
link.href = url;
link.target = '_blank';
link.setAttribute('download', 'Excel名字.xlsx');
document.body.appendChild(link);
link.click();
responseType值的類型
| 值 | 數(shù)據(jù)類型 |
|---|---|
| ‘’ | DOMString(默認(rèn)類型) |
| arraybuffer | ArrayBuffer對象 |
| blob | Blob對象 |
| document | Documnet對象 |
| json | JavaScript object, parsed from a JSON string returned by the server |
| text | DOMString |
實例
返回值不同情況的處理方式,舉例如下:
①、請求設(shè)置為 responseType: ‘arraybuffer’,
請求成功時,后端返回文件流,正常導(dǎo)出文件;
請求失敗時,后端返回json對象,如:{“Status”:“false”,“StatusCode”:“500”,“Result”:“操作失敗”},也被轉(zhuǎn)成了arraybuffer
此時請求成功和失敗返回的http狀態(tài)碼都是200
解決方案:將已轉(zhuǎn)為arraybuffer類型的數(shù)據(jù)轉(zhuǎn)回Json對象,然后進行判斷
代碼如下
async downloadFile (file) {
let res = await this.$axios.post(this.API.order.tradeImpExcle, { responseType: "arraybuffer" });
if (!res) return;
try {
//如果JSON.parse(enc.decode(new Uint8Array(res.data)))不報錯,說明后臺返回的是json對象,則彈框提示
//如果JSON.parse(enc.decode(new Uint8Array(res.data)))報錯,說明返回的是文件流,進入catch,下載文件
let enc = new TextDecoder('utf-8')
res = JSON.parse(enc.decode(new Uint8Array(res.data))) //轉(zhuǎn)化成json對象
if (res.Status == "true") {
this.refresh()
this.$message.success(res.Msg)
} else {
this.$message.error(res.Result)
}
} catch (err) {
const content = res.data;
const blob = new Blob([content]);
let url = window.URL.createObjectURL(blob);
let link = document.createElement("a");
link.style.display = "none";
link.href = url;
link.setAttribute(
"download",
res.headers["content-disposition"].split("=")[1]
);
document.body.appendChild(link);
link.click();
}
}
②、請求設(shè)置為 responseType: ‘blob’,
解決方案:將已轉(zhuǎn)為blob類型的數(shù)據(jù)轉(zhuǎn)回Json對象,然后進行判斷
代碼如下
async downloadFile (file) {
let formData = new FormData();
formData.append("allTradesExcelFile", file);
let res = await this.$axios.post(this.API.order.tradeImpExcle, formData, { responseType: "blob" });
if (!res) return;
let r = new FileReader()
let _this = this
r.onload = function () {
try {
// 如果JSON.parse(this.result)不報錯,說明this.result是json對象,則彈框提示
// 如果JSON.parse(this.result)報錯,說明返回的是文件流,進入catch,下載文件
res = JSON.parse(this.result)
if (res.Status == "true") {
_this.refresh()
_this.$message.success(res.Msg)
} else {
_this.$message.error(res.Result)
}
} catch (err) {
const content = res.data;
const blob = new Blob([content]);
let url = window.URL.createObjectURL(blob);
let link = document.createElement("a");
link.style.display = "none";
link.href = url;
link.setAttribute(
"download",
res.headers["content-disposition"].split("=")[1]
);
document.body.appendChild(link);
link.click();
}
}
r.readAsText(res.data) // FileReader的API
}
總結(jié)
到此這篇關(guān)于axios請求設(shè)置responseType為'blob'或'arraybuffer'下載時如何正確處理返回值的文章就介紹到這了,更多相關(guān)axios請求設(shè)置responseType下載返回值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
前端js使用xlsx-js-style導(dǎo)出Excel文件并修飾單元格樣式
這篇文章主要給大家介紹了關(guān)于前端js使用xlsx-js-style導(dǎo)出Excel文件并修飾單元格樣式的相關(guān)資料,前端開發(fā)過程中經(jīng)常遇到導(dǎo)出excel的需求,需要的朋友可以參考下2023-08-08

