前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vue 带token下载——XMLHttpRequest + blob 下载文件流(vue导出excel乱码问题)

vue 带token下载——XMLHttpRequest + blob 下载文件流(vue导出excel乱码问题)

作者头像
celineWong7
发布2020-11-06 12:53:08
3.8K0
发布2020-11-06 12:53:08
举报
文章被收录于专栏:web前端踩坑web前端踩坑

以前的文件下载可以直接通过a标签链接跳转,或者window.open()等都是打开页面方式直接处理。 但这次的vue项目中,因为后台需要通过请求头部信息拿token信息,就导致上面的直接打开页面方式失效,只能通过blob实现流文件的下载。

从网上查了些方法,后面采用了下面这种实现方式。具体每个模块的代码意思还不是很清楚,后续会在补充,此处直接先给出源码。

代码语言:javascript
复制
/** 导出需要携带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);
}
代码语言:javascript
复制
// auth.js 文件内容
import Cookies from 'js-cookie'
const TokenKey = 'Admin-Token'
export function getToken() {
  return Cookies.get(TokenKey)
}

参考文章:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档