Vue如何實(shí)現(xiàn)將后端返回二進(jìn)制文件在瀏覽器自動(dòng)下載
一、關(guān)鍵代碼
export function downloadFile(fileName) {
axios({
method: 'post',
url: process.env.VUE_APP_BASE_API + '/cgi-bin/file',
data: {
'X-Token': getToken(),
method: 'download',
data: {
filename: fileName
}
},
responseType: 'blob'
}).then((res) => {
const blob = new Blob([res.data], { type: 'application/octet-stream;charset=utf-8' }); // 將二進(jìn)制流轉(zhuǎn)為blob
const a = document.createElement('a');
const url = window.URL.createObjectURL(blob); // 創(chuàng)建新的url并指向file對(duì)象或blob對(duì)象的地址
a.href = url;
a.download = fileName; // 設(shè)置下載文件名
a.style.display = 'none'; //避免數(shù)據(jù)量過大,下載時(shí)間長(zhǎng),看到a標(biāo)簽
document.body.appendChild(a);
a.click();//關(guān)鍵;調(diào)用點(diǎn)擊事件,(模擬a標(biāo)簽的點(diǎn)擊下載效果)
document.body.removeChild(a); // 下載完成移除元素
window.URL.revokeObjectURL(url); // 釋放內(nèi)存
});
}
二、實(shí)現(xiàn)邏輯
首先,整個(gè)下載邏輯執(zhí)行有以下幾步:
1.前端發(fā)起請(qǐng)求拿到后端返回的二進(jìn)制格式的數(shù)據(jù);
2.將請(qǐng)求響應(yīng)體中的二進(jìn)制目標(biāo)數(shù)據(jù)轉(zhuǎn)行為blob類型的數(shù)據(jù);
3.創(chuàng)建一個(gè)a標(biāo)簽,后續(xù)的自動(dòng)下載的關(guān)鍵功能就是利用a.click()實(shí)現(xiàn);
4.利用window.URL.createObjectURL(blob)方法,利用第二步轉(zhuǎn)換的blob數(shù)據(jù)創(chuàng)建出一個(gè)url,并賦值給第三步創(chuàng)建的a標(biāo)簽的href屬性;
5.利用document.body.appendChild(a)將a標(biāo)簽添加到body標(biāo)簽中,后執(zhí)行a.click()實(shí)現(xiàn)文件下載;
6.下載完成后,要移除a標(biāo)簽,使用代碼document.body.removeChild(a)實(shí)現(xiàn);
7.釋放第四步創(chuàng)建的url地址內(nèi)存;
8.整個(gè)下載流程結(jié)束。
三、代碼解讀

如上圖,封裝了下載文件的函數(shù),其中axios網(wǎng)絡(luò)請(qǐng)求的編寫根據(jù)你實(shí)際后端定的接口來(lái)寫,主要目的就是拿到后端返回的二進(jìn)制數(shù)據(jù)。其中fileName,是當(dāng)前請(qǐng)求一個(gè)參數(shù),同時(shí)也作為后續(xù)要用到的文件名。需要注意的是,請(qǐng)求的responseType:"blob"。
二進(jìn)制格式數(shù)據(jù)轉(zhuǎn)行blob數(shù)據(jù)類型的代碼;
const blob = new Blob([res.data], { type: 'application/octet-stream;charset=utf-8' }); // 將二進(jìn)制流轉(zhuǎn)為blob
創(chuàng)建a標(biāo)簽;創(chuàng)建url地址;給a標(biāo)簽href屬性賦值url地址;執(zhí)行點(diǎn)擊操作;最后移除a標(biāo)簽 釋放url內(nèi)容。
const a = document.createElement('a');
const url = window.URL.createObjectURL(blob); // 創(chuàng)建新的url并指向file對(duì)象或blob對(duì)象的地址
a.href = url;
a.download = fileName; // 設(shè)置下載文件名
a.style.display = 'none'; //避免數(shù)據(jù)量過大,下載時(shí)間長(zhǎng),看到a標(biāo)簽
document.body.appendChild(a);
a.click(); //關(guān)鍵;調(diào)用點(diǎn)擊事件,(模擬a標(biāo)簽的點(diǎn)擊下載效果)
document.body.removeChild(a); // 下載完成移除元素
window.URL.revokeObjectURL(url); // 釋放內(nèi)存以上就是Vue如何實(shí)現(xiàn)將后端返回二進(jìn)制文件在瀏覽器自動(dòng)下載的詳細(xì)內(nèi)容,更多關(guān)于Vue瀏覽器自動(dòng)下載的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
ElementUI+命名視圖實(shí)現(xiàn)復(fù)雜頂部和左側(cè)導(dǎo)航欄
本文主要介紹了ElementUI+命名視圖實(shí)現(xiàn)復(fù)雜頂部和左側(cè)導(dǎo)航欄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
nuxt 每個(gè)頁(yè)面head標(biāo)簽內(nèi)容設(shè)置方式
這篇文章主要介紹了nuxt 每個(gè)頁(yè)面head標(biāo)簽內(nèi)容設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-11-11
vue 搭建后臺(tái)系統(tǒng)模塊化開發(fā)詳解
這篇文章主要介紹了vue 搭建后臺(tái)系統(tǒng)模塊化開發(fā)詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2019-05-05
使用Vue2實(shí)現(xiàn)簡(jiǎn)單的購(gòu)物車功能(可直接使用)
這篇文章主要給大家介紹了如何使用Vue2實(shí)現(xiàn)簡(jiǎn)單的購(gòu)物車功能,文中有相關(guān)的代碼示例,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-08-08
如何使用Webstorm和Chrome來(lái)調(diào)試Vue項(xiàng)目
這篇文章主要介紹了如何使用Webstorm和Chrome來(lái)調(diào)試Vue項(xiàng)目,對(duì)Vue感興趣的同學(xué),一定要看一下2021-05-05
vue - vue.config.js中devServer配置方式
今天小編就為大家分享一篇vue - vue.config.js中devServer配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-10-10

