前端异步+token下载文件

首先,需要登录的时候把token塞入localStorage里面

js 复制代码
localStorage.setItem('token', data.token);

再写一个公用方法来下载文件(基于ts)

逻辑就是先发一个请求,返回成功后,创建一个a标签,然后点击它

ts 复制代码
// 下载文件
export const download = (link: string, filename: string) => {
  const xhr = new XMLHttpRequest();
  // POST请求,link,async(是否异步)
  xhr.open("POST", link, true);
  // //设置请求头参数的方式,如果没有可忽略此行代码
  xhr.setRequestHeader("token", window?.localStorage?.getItem("token"));
  // //设置响应类型为 blob
  xhr.responseType = "blob";
  // //关键部分
  xhr.onload = function() {
    //   //如果请求执行成功
    if (this.status === 200) {
      const blob = this.response;
      // 创建一个a标签
      const a = document.createElement("a");
      // blob.type = "application/octet-stream";
      // 创键临时url对象
      const url = window.URL.createObjectURL(new Blob([blob]));
      a.href = url;
      a.download = filename;
      // 点击a标签
      a.click();
      // 释放之前创建的URL对象
      window.URL.revokeObjectURL(link);
    }
  };
  // //发送请求
  xhr.send();
}

以下为测试(基于React)

ts 复制代码
		<Button
            onClick={() => {
        // currentPage、pageSize是分页信息,id、name是查询信息
              const link = `localhost:8080/url?currentPage=${searchParams.currentPage}&pageSize=${searchParams.pageSize}${searchParams.id !== undefined ? `&id=${searchParams.id}` : ""}${searchParams.name !== undefined ? `&name=${searchParams.name}` : ""}`
              download(link, "信息.xlsx")
            }}
            key="download"
            target='_blank'
          >
            <CloudDownloadOutlined /> 导出本页
          </Button>
相关推荐
小桥风满袖5 分钟前
极简三分钟ES6 - ES9中字符串扩展
前端·javascript
小Wang16 分钟前
npm私有库创建(docker+verdaccio)
前端·docker·npm
用户730870117930817 分钟前
Vue中集成文字转语音:使用Web Speech API实现功能
前端
前端人类学18 分钟前
掌控异步洪流:多请求并发下的顺序控制艺术
javascript·promise
李重楼18 分钟前
前端性能优化之 HTTP/2 多路复用
前端·面试
yanessa_yu21 分钟前
全屏滚动网站PC端自适应方案
前端
RoyLin28 分钟前
TypeScript设计模式:桥接模式
前端·后端·typescript
火星开发者31 分钟前
Vue中实现Word、Excel、PDF预览的详细步骤
前端
CryptoRzz32 分钟前
印度尼西亚股票数据API对接实现
javascript·后端
brzhang37 分钟前
干翻 Docker?WebAssembly 3.0 的野心,远不止浏览器,来一起看看吧
前端·后端·架构