vue中axios利用blob實(shí)現(xiàn)文件瀏覽器下載方式
vue axios利用blob實(shí)現(xiàn)文件瀏覽器下載
在vue中,使用axios向后臺請求數(shù)據(jù),但只接收返回的response并不能實(shí)現(xiàn)瀏覽器下載,所以需要借助于blob實(shí)現(xiàn)文件的瀏覽器下載,分為兩種情況,一種是get請求,使用params,另一種使用post請求,參數(shù)使用formdata傳參
情景1:get請求,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請求,formdata傳參
url與參數(shù)部分代碼:
this.axios.post('/api/downloadConfig', form, {responseType:'blob'})blob具體下載實(shí)現(xiàn)代碼與上文get請求一致
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)制流,一般用于文件、視頻下載等場景。
正常情況下后端返回二進(jìn)制數(shù)據(jù),當(dāng)后端服務(wù)器出錯時(shí),往往會以json形式返回錯誤信息,例如{"code":500,"msg":"未知異常"}。
因?yàn)樵O(shè)置了blob類型,axios會強(qiáng)制把數(shù)據(jù)轉(zhuǎn)為blob,導(dǎo)致json格式的響應(yīng)沒辦法正常解析,需要使用FileReader對象來處理,F(xiàn)ileReader是一種異步讀取文件機(jī)制。
FileReader提供了如下方法,大家根據(jù)需要自行選擇。
readAsArrayBuffer(file):按字節(jié)讀取文件內(nèi)容,結(jié)果用ArrayBuffer對象表示readAsBinaryString(file):按字節(jié)讀取文件內(nèi)容,結(jié)果為文件的二進(jìn)制串readAsDataURL(file):讀取文件內(nèi)容,結(jié)果用data:url的字符串形式表示readAsText(file,encoding):按字符讀取文件內(nèi)容,結(jié)果用字符串形式表示
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(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-02
vue.js el-tooltip根據(jù)文字長度控制是否提示toolTip問題
這篇文章主要介紹了vue.js el-tooltip根據(jù)文字長度控制是否提示toolTip問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02
Vue中watch與watchEffect的區(qū)別詳細(xì)解讀
這篇文章主要介紹了Vue中watch與watchEffect的區(qū)別詳細(xì)解讀,watch函數(shù)與watchEffect函數(shù)都是監(jiān)聽器,在寫法和用法上有一定區(qū)別,是同一功能的兩種不同形態(tài),底層都是一樣的,需要的朋友可以參考下2023-11-11
Vue-router編程式導(dǎo)航的兩種實(shí)現(xiàn)代碼
這篇文章主要介紹了Vue-router編程式導(dǎo)航的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03

