以前的文件下載可以直接通過
a
標簽鏈接跳轉,或者window.open()
等都是打開頁面方式直接處理。
但這次的vue項目中,因為后臺需要通過請求頭部信息拿token信息,就導致上面的直接打開頁面方式失效,只能通過blob實現流文件的下載。
從網上查了些方法,后面采用了下面這種實現方式。具體每個模塊的代碼意思還不是很清楚,后續會在補充,此處直接先給出源碼。
/** 導出需要攜帶token,此處采用原生XMLHttpRequest去下載文件流 */
import { getToken } from '@/utils/auth'
export function exportByXML(params){
let baseURL = process.env.BASE_API;
function createObjectURL(object) {
return (window.URL) ? window.URL.createObjectURL(object) : window.webkitURL.createObjectURL(object);
}
var xhr = new XMLHttpRequest();
var formData = new FormData();
xhr.open('get', baseURL + params.url); //url填寫后臺的接口地址,如果是post,在formData append參數(參考原文地址)
xhr.setRequestHeader("Authorization", getToken());
xhr.responseType = 'blob';
xhr.onload = function (e) {
if (this.status == 200) {
var blob = this.response;
var filename = params.fileName;
// console.log(this.response)
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(blob,filename);
} else {
var a = document.createElement('a');
var url = createObjectURL(blob);
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
}
}
};
xhr.send(formData);
}
// auth.js 文件內容
import Cookies from 'js-cookie'
const TokenKey = 'Admin-Token'
export function getToken() {
return Cookies.get(TokenKey)
}
參考文章:
-
前端處理文件下載(帶請求頭) : 采用了原生的
XMLHttpRequest
方式和blob
方式。——此方法試驗有效,目前在用。 -
Vue2 導出Excel + 解決亂碼問題 —— axios (下載后臺傳過來的流文件(excel)后亂碼問題):給出了3種解決方案(都是結合
axios
請求方式):有的采用js-file-download
方案;有的采用blob
方式。——還沒有驗證,不知道效果如何?? -
axios全攻略 詳細給出了axios的配置,此處主要參考下
responseType
的配置項。