vue中axios利用blob實(shí)現(xiàn)文件瀏覽器下載方式
vue axios利用blob實(shí)現(xiàn)文件瀏覽器下載
在vue中,使用axios向后臺(tái)請(qǐng)求數(shù)據(jù),但只接收返回的response并不能實(shí)現(xiàn)瀏覽器下載,所以需要借助于blob實(shí)現(xiàn)文件的瀏覽器下載,分為兩種情況,一種是get請(qǐng)求,使用params,另一種使用post請(qǐng)求,參數(shù)使用formdata傳參
情景1:get請(qǐng)求,params傳參
url與參數(shù)部分代碼:
this.axios.get('/api/downloadConfig', { params:{oid:oid}, responseType:'blob', })
blob具體下載實(shí)現(xiàn)代碼
if(res.status === 200){ const content = res.data; const blob = new Blob([content]); if('download' in document.createElement('a')){ //非IE下載 const a = document.createElement('a'); a.download = fileName; a.style.display = 'none'; a.href = window.URL.createObjectURL(blob); document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(a.href); document.body.removeChild(a); }else{ //IE10+下載 if(typeof window.navigator.msSaveBlob !== 'undefined'){ window.navigator.msSaveBlob(blob, _this.selected); }else{ let URL = window.URL || window.webkitURL; let downloadUrl = URL.createObjectURL(blob); window.location = downloadUrl; } }
情景2:post請(qǐng)求,formdata傳參
url與參數(shù)部分代碼:
this.axios.post('/api/downloadConfig', form, {responseType:'blob'})
blob具體下載實(shí)現(xiàn)代碼與上文get請(qǐng)求一致
vue axios實(shí)現(xiàn)下載文件及responseType:blob注意事項(xiàng)
需要使用axios和js-file-download組件
npm install js-file-download --save npm install axios --save
import fileDownload from 'fileDownload'; // 引入fileDownload import axios from 'axios'; // 引入axios axios({ method: 'get', url: 'xxxxxxx', responseType: 'blob' }).then(res => { if(res.status == 200){ // res.headers['content-disposition'].substring(20)表示從響應(yīng)頭中獲取文件名 fileDownload(res.data,res.headers['content-disposition'].substring(20)); }else { // 下載文件失敗,解析json格式信息 let that = this; var fileReader = new FileReader(); fileReader.readAsText(res.data); // 按字節(jié)讀取文件內(nèi)容,結(jié)果為文件的二進(jìn)制串 fileReader.onload = ()=>{ that.$notify.error(fileReader.result); } } })
注意事項(xiàng):
responseType:blob表示服務(wù)器返回的響應(yīng)類型是二進(jìn)制流,一般用于文件、視頻下載等場(chǎng)景。
正常情況下后端返回二進(jìn)制數(shù)據(jù),當(dāng)后端服務(wù)器出錯(cuò)時(shí),往往會(huì)以json形式返回錯(cuò)誤信息,例如{"code":500,"msg":"未知異常"}。
因?yàn)樵O(shè)置了blob類型,axios會(huì)強(qiáng)制把數(shù)據(jù)轉(zhuǎn)為blob,導(dǎo)致json格式的響應(yīng)沒辦法正常解析,需要使用FileReader對(duì)象來處理,F(xiàn)ileReader是一種異步讀取文件機(jī)制。
FileReader提供了如下方法,大家根據(jù)需要自行選擇。
readAsArrayBuffer(file)
:按字節(jié)讀取文件內(nèi)容,結(jié)果用ArrayBuffer對(duì)象表示readAsBinaryString(file)
:按字節(jié)讀取文件內(nèi)容,結(jié)果為文件的二進(jìn)制串readAsDataURL(file)
:讀取文件內(nèi)容,結(jié)果用data:url的字符串形式表示readAsText(file,encoding)
:按字符讀取文件內(nèi)容,結(jié)果用字符串形式表示
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue.config.js中配置分包策略及常見的配置選項(xiàng)
在Vue.js中分包(Code Splitting)是一種將應(yīng)用程序代碼拆分為不同的塊或包的技術(shù),從而在需要時(shí)按需加載這些包,下面這篇文章主要給大家介紹了關(guān)于vue.config.js中配置分包策略及常見的配置選項(xiàng)的相關(guān)資料,需要的朋友可以參考下2024-02-02vue.js el-tooltip根據(jù)文字長(zhǎng)度控制是否提示toolTip問題
這篇文章主要介紹了vue.js el-tooltip根據(jù)文字長(zhǎng)度控制是否提示toolTip問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02Vue中watch與watchEffect的區(qū)別詳細(xì)解讀
這篇文章主要介紹了Vue中watch與watchEffect的區(qū)別詳細(xì)解讀,watch函數(shù)與watchEffect函數(shù)都是監(jiān)聽器,在寫法和用法上有一定區(qū)別,是同一功能的兩種不同形態(tài),底層都是一樣的,需要的朋友可以參考下2023-11-11解析Vue2 dist 目錄下各個(gè)文件的區(qū)別
本篇文章主要介紹了解析Vue2 dist 目錄下各個(gè)文件的區(qū)別,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11Vue-router編程式導(dǎo)航的兩種實(shí)現(xiàn)代碼
這篇文章主要介紹了Vue-router編程式導(dǎo)航的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03element滾動(dòng)條組件el-scrollbar的使用詳解
本文主要介紹了element滾動(dòng)條組件el-scrollbar的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04