axios請求設置responseType為'blob'或'arraybuffer'下載時如何正確處理返回值
問題:
調用后臺圖片接口,后臺返回二進制流圖片數(shù)據(jù)格式。前端接收到流后處理數(shù)據(jù)顯示在img標簽。
解決:
1、設置axios接收參數(shù)格式為"arraybuffer":
responseType: 'arraybuffer'
2、轉換為base64格式圖片數(shù)據(jù)在img標簽顯示:
return 'data:image/png;base64,' + btoa(
new Uint8Array(res.data).reduce((data, byte) => data + String.fromCharCode(byte), '')
);
返回的string直接放在img標簽src可直接顯示
設置axios接收參數(shù)格式為"blob":
axios.post( ExportUrl, Params, {
responseType: 'blob'
})
.then(function(response) {
this.url = window.URL.createObjectURL(new Blob([response.data]));
});
通過a標簽下載文件
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(默認類型) |
| arraybuffer | ArrayBuffer對象 |
| blob | Blob對象 |
| document | Documnet對象 |
| json | JavaScript object, parsed from a JSON string returned by the server |
| text | DOMString |
實例
返回值不同情況的處理方式,舉例如下:
①、請求設置為 responseType: ‘arraybuffer’,
請求成功時,后端返回文件流,正常導出文件;
請求失敗時,后端返回json對象,如:{“Status”:“false”,“StatusCode”:“500”,“Result”:“操作失敗”},也被轉成了arraybuffer
此時請求成功和失敗返回的http狀態(tài)碼都是200
解決方案:將已轉為arraybuffer類型的數(shù)據(jù)轉回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))) //轉化成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();
}
}
②、請求設置為 responseType: ‘blob’,
解決方案:將已轉為blob類型的數(shù)據(jù)轉回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
}
總結
到此這篇關于axios請求設置responseType為'blob'或'arraybuffer'下載時如何正確處理返回值的文章就介紹到這了,更多相關axios請求設置responseType下載返回值內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
HTML+CSS+JavaScript實現(xiàn)簡單日歷效果
這篇文章主要為大家詳細介紹了HTML+CSS+JavaScript實現(xiàn)簡單日歷效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07
jquery pagination插件動態(tài)分頁實例(Bootstrap分頁)
這篇文章主要為大家分享了Bootstrap靜態(tài)分頁和jquery pagination插件動態(tài)分頁兩個實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12
BootStrap daterangepicker 雙日歷控件
這篇文章主要介紹了BootStrap daterangepicker 雙日歷控件,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-06-06
elemetUi 組件--el-upload實現(xiàn)上傳Excel文件的實例
這篇文章主要介紹了elemetUi 組件--el-upload實現(xiàn)上傳Excel文件的實例的相關資料,希望通過本文大家能夠實現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10

