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