寫vue項目用的axios庫,在處理下載文件的時候,發現後端返回的是文件流,沒法直接下載,只能用a標籤處理,可是對於有鑑權的下載,a標籤顯然是不合適的了。因而乎就查閱各類資料各類鼓搗終於搞出來了vue
請求下載的時候設置responseType爲blob,例如:ios
export function apiDownloadFiles(fielId) { return axios({ url: `/document/${fielId}`, method: 'get', responseType: 'blob' }) } 複製代碼
這樣請求就會走axios攔截器裏配置的方法,你就能夠給下載添加請求頭token了json
後端返回了的文件流是這樣的 axios
這個時候要怎麼處理才能變成文件呢?apiDownloadFiles(file.id).then(res => { if (res.data.type === "application/json") { this.$message({ type: "error", message: "下載失敗,文件不存在或權限不足" }); } else { let blob = new Blob([res.data]); if (window.navigator.msSaveOrOpenBlob) { navigator.msSaveBlob(blob, file.fileName); } else { let link = document.createElement("a"); let evt = document.createEvent("HTMLEvents"); evt.initEvent("click", false, false); link.href = URL.createObjectURL(blob); link.download = file.fileName; link.style.display = "none"; document.body.appendChild(link); link.click(); window.URL.revokeObjectURL(link.href); } } }); 複製代碼
模擬a標籤點擊,成功下載文件。 若是沒有太多參數的下載文件,能夠直接下載,這種沒有token,比較適合用cookies和後端作認證的。後端
const link = document.createElement('a') const evt = document.createEvent('HTMLEvents') evt.initEvent('click', false, false) link.href = `${process.env.BASE_API}/template/download/${this.fileId}` link.target = '_blank' link.style.display = 'none' document.body.appendChild(link) link.click() window.URL.revokeObjectURL(link.href) 複製代碼