vue 帶token下載——XMLHttpRequest + blob 下載文件流(vue導出excel亂碼問題)

以前的文件下載可以直接通過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)
}

參考文章:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容