axios請(qǐng)求設(shè)置responseType為'blob'或'arraybuffer'下載時(shí)如何正確處理返回值
問(wèn)題:
調(diào)用后臺(tái)圖片接口,后臺(tái)返回二進(jìn)制流圖片數(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])); });
通過(guò)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值的類(lèi)型
值 | 數(shù)據(jù)類(lèi)型 |
---|---|
‘’ | DOMString(默認(rèn)類(lèi)型) |
arraybuffer | ArrayBuffer對(duì)象 |
blob | Blob對(duì)象 |
document | Documnet對(duì)象 |
json | JavaScript object, parsed from a JSON string returned by the server |
text | DOMString |
實(shí)例
返回值不同情況的處理方式,舉例如下:
①、請(qǐng)求設(shè)置為 responseType: ‘arraybuffer’,
請(qǐng)求成功時(shí),后端返回文件流,正常導(dǎo)出文件;
請(qǐng)求失敗時(shí),后端返回json對(duì)象,如:{“Status”:“false”,“StatusCode”:“500”,“Result”:“操作失敗”},也被轉(zhuǎn)成了arraybuffer
此時(shí)請(qǐng)求成功和失敗返回的http狀態(tài)碼都是200
解決方案:將已轉(zhuǎn)為arraybuffer類(lèi)型的數(shù)據(jù)轉(zhuǎn)回Json對(duì)象,然后進(jìn)行判斷
代碼如下
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)))不報(bào)錯(cuò),說(shuō)明后臺(tái)返回的是json對(duì)象,則彈框提示 //如果JSON.parse(enc.decode(new Uint8Array(res.data)))報(bào)錯(cuò),說(shuō)明返回的是文件流,進(jìn)入catch,下載文件 let enc = new TextDecoder('utf-8') res = JSON.parse(enc.decode(new Uint8Array(res.data))) //轉(zhuǎn)化成json對(duì)象 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(); } }
②、請(qǐng)求設(shè)置為 responseType: ‘blob’,
解決方案:將已轉(zhuǎn)為blob類(lèi)型的數(shù)據(jù)轉(zhuǎn)回Json對(duì)象,然后進(jìn)行判斷
代碼如下
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)不報(bào)錯(cuò),說(shuō)明this.result是json對(duì)象,則彈框提示 // 如果JSON.parse(this.result)報(bào)錯(cuò),說(shuō)明返回的是文件流,進(jìn)入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請(qǐng)求設(shè)置responseType為'blob'或'arraybuffer'下載時(shí)如何正確處理返回值的文章就介紹到這了,更多相關(guān)axios請(qǐng)求設(shè)置responseType下載返回值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
HTML+CSS+JavaScript實(shí)現(xiàn)簡(jiǎn)單日歷效果
這篇文章主要為大家詳細(xì)介紹了HTML+CSS+JavaScript實(shí)現(xiàn)簡(jiǎn)單日歷效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07js實(shí)現(xiàn)點(diǎn)擊彈窗彈出登錄框
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)點(diǎn)擊彈窗彈出登錄框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04js中判斷變量類(lèi)型函數(shù)typeof的用法總結(jié)
下面小編就為大家?guī)?lái)一篇js中判斷變量類(lèi)型函數(shù)typeof的用法總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08javascript簡(jiǎn)單實(shí)現(xiàn)命名空間效果
這篇文章主要介紹了javascript簡(jiǎn)單的實(shí)現(xiàn)命名空間效果的方法。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-03-03jquery pagination插件動(dòng)態(tài)分頁(yè)實(shí)例(Bootstrap分頁(yè))
這篇文章主要為大家分享了Bootstrap靜態(tài)分頁(yè)和jquery pagination插件動(dòng)態(tài)分頁(yè)兩個(gè)實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Javascript自定義排序 node運(yùn)行 實(shí)例
Javascript自定義排序 node運(yùn)行 實(shí)例,需要的朋友可以參考一下2013-06-06BootStrap daterangepicker 雙日歷控件
這篇文章主要介紹了BootStrap daterangepicker 雙日歷控件,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-06-06elemetUi 組件--el-upload實(shí)現(xiàn)上傳Excel文件的實(shí)例
這篇文章主要介紹了elemetUi 組件--el-upload實(shí)現(xiàn)上傳Excel文件的實(shí)例的相關(guān)資料,希望通過(guò)本文大家能夠?qū)崿F(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10