以前由於懶,異步請求的下載都是直接寫在a標籤裏,請求權限讓後端作特殊處理判斷,就像這樣
<a href="getRequestUrl">點擊下載</a>
如今以爲這樣處理不太好,一個是後端權限要作單獨判斷,另外一個是若是調用接口報錯就沒辦法處理了,研究以後修改了一下,項目用了axios這個lib,因此是針對axios的request和response作了修改,不過對於原生寫法和其餘庫,原理是同樣的
function exportData(p) { return axios({ url: '/data/export', method: 'get', params: p, responseType: 'blob' }); }
由於項目裏用了response攔截器來處理響應,因此我在攔截器裏作了處理,也能夠單獨處理。javascript
axios.interceptors.response.use( response=> { // ... // Blob類型處理 let checkType = response.config.responseType; if(checkType === "blob" && res.type === 'application/octet-stream') { // 正常下載時直接返回響應數據 return response.data } else if(checkType === "blob" && res.type === 'application/json') { // 請求出錯時,接口返回的內容是json,因而將blob中的內容取出 let reader = new FileReader(); reader.onload = function(event){ let content = reader.result; // blob中的內容 Message({ message: JSON.parse(content).desc, type: 'error', duration: 5 * 1000 }) }; reader.readAsText(response.data); return Promise.reject('error') } // ... }, error => { // ... } )
exportData(para).then(res => { let content = res; let aTag = document.createElement('a'); let blob = new Blob([content]); aTag.download = 'Datas.xlsx'; // 也能夠讓後端設置文件名,經過headers返回 aTag.href = URL.createObjectURL(blob); aTag.click(); URL.revokeObjectURL(blob); }).finally(() => { })
參考博客: https://www.cnblogs.com/coder...