前端處理axios請(qǐng)求下載后端返回的文件流代碼實(shí)例
需求:
點(diǎn)擊按鈕下載文件,請(qǐng)求后端接口,后端返回文件流,如果遇到錯(cuò)誤信息并不能簡(jiǎn)單的res.message拿到錯(cuò)誤提示,而且想要正常下載前端也需要做些處理。
1.請(qǐng)求接口要加上響應(yīng)類型為blob, responseType: ‘blob’,如:
function logsDownload(params) { return axios.get('xxx/xxx/xxx',{ params, responseType: 'blob' }) }
2.定義一個(gè)下載的方法
function download(fileName ='log', type: 'txt' | 'json, file:Blob) { const blob = new Blob([file]); // 獲取heads中的filename文件名 const downloadElement = document.createElement('a'); // 創(chuàng)建下載的鏈接 const href = window.URL.createObjectURL(blob); downloadElement.href = href; // 下載后文件名 downloadElement.download = `${fileName}.${type}` document.body.appendChild(downloadElement); // 點(diǎn)擊下載 downloadElement.click(); // 下載完成移除元素 document.body.removeChild(downloadElement); // 釋放掉blob對(duì)象 window.URL.revokeObjectURL(href); }
3.借助FileReader對(duì)象實(shí)現(xiàn),F(xiàn)ileReader.readAsText(data)開(kāi)始讀取指定的Blob中的內(nèi)容。
result屬性中將包含一個(gè)字符串以表示所讀取的文件內(nèi)容。
讀取操作完成時(shí)觸發(fā)FileReader.onload(),在這里通過(guò)reader.result拿到讀取的文件內(nèi)容(即后端返回值),然后對(duì)其json序列化,即
可拿到后端返回的message,然后進(jìn)行相應(yīng)的展示即可。
// 定義一個(gè)讀取文件的方法 async function readFileAsText (file:File){ const fileReader = new FileReader() let text await new Promise(resolve=>{ fileReader.onLoad = ()=>{ text = fileReader.result resolve(true) } fileReader.readAsText(file, 'utf8') }) return text || '' }
4.請(qǐng)求成功和失敗的返回結(jié)果是不同
請(qǐng)求下載一個(gè)文件,請(qǐng)求成功時(shí)返回的是一個(gè)文件流,type是對(duì)應(yīng)文件類型,例如:text/xml,正常導(dǎo)出文件; 而請(qǐng)求失敗的時(shí)候返回的是json ,type為application/json,不會(huì)處理錯(cuò)誤信息,而是直接導(dǎo)出包含錯(cuò)誤信息的文件。
但是無(wú)論成功還是失敗,返回的結(jié)果都是blob格式的文件流。
因此可以通過(guò)返回的blob數(shù)據(jù)type類型進(jìn)行區(qū)分,如果type是文件類型,導(dǎo)出文件,如果type是json則把blob數(shù)據(jù)轉(zhuǎn)為string,處理錯(cuò)誤信息。
在響應(yīng)攔截器那里加入以下,需要判斷如果時(shí)文件流直接返回的情況
// 響應(yīng)攔截器 banseInstance.interceptors.response.use(response => { ... // 文件流直接返回 if (response .request.responseType === 'blob' ) { if (response .data.type === 'application/json') { const res = await readFileAsText(response.data) ElMessage.error(JSON.parse(res).message || '下載失敗') return false; } else { return response .data; } } ... }
點(diǎn)擊按鈕下載
const handleDown = () => { const fileName = 'xxxx' const file = await logsDownload(params) if (file) { download(fileName, 'txt', file) ElMessage.success('下載成功') } }
總結(jié)
到此這篇關(guān)于前端處理axios請(qǐng)求下載后端返回的文件流的文章就介紹到這了,更多相關(guān)axios請(qǐng)求下載后端返回文件流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue+Echarts報(bào)錯(cuò)Cannot?set?properties?of?undefined?(settin
這篇文章主要介紹了Vue+Echarts報(bào)錯(cuò)Cannot?set?properties?of?undefined?(setting?‘plate‘)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08vue調(diào)試工具沒(méi)有Pinia模塊的簡(jiǎn)單解決辦法
Pinia是Vue的存儲(chǔ)庫(kù),它允許您跨組件/頁(yè)面共享狀態(tài),這篇文章主要給大家介紹了關(guān)于vue調(diào)試工具沒(méi)有Pinia模塊的簡(jiǎn)單解決辦法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02Vue項(xiàng)目總結(jié)之webpack常規(guī)打包優(yōu)化方案
這篇文章主要介紹了vue項(xiàng)目總結(jié)之webpack常規(guī)打包優(yōu)化方案,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06Vue.js中自定義Markdown插件實(shí)現(xiàn)References解析(推薦)
本文主要寫(xiě)的是,如何編寫(xiě)一個(gè)插件來(lái)解析<references>標(biāo)簽,并將其轉(zhuǎn)換為HTML,這種方法可以應(yīng)用于其他自定義標(biāo)簽和功能,為Vue.js應(yīng)用程序中的Markdown渲染提供了極大的靈活性,感興趣的朋友跟隨小編一起看看吧2024-07-07vue中keep-alive組件使用和一些基礎(chǔ)配置方法
本文主要介紹了Vue中keep-alive組件的使用方法和一些基礎(chǔ)配置,keep-alive是Vue中的一個(gè)抽象組件,可以緩存組件實(shí)例,提高性能,本文給大家介紹vue中keep-alive組件使用和一些基礎(chǔ)配置方法,感興趣的朋友一起看看吧2024-10-10vue實(shí)現(xiàn)購(gòu)物車(chē)小案例
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)購(gòu)物車(chē)小案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09vue中echarts圖表大小適應(yīng)窗口大小且不需要刷新案例
這篇文章主要介紹了vue中echarts圖表大小適應(yīng)窗口大小且不需要刷新案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07