当前位置:首页 » 《我的小黑屋》 » 正文

前端实现流文件下载、导出功能解决方案

28 人参与  2024年04月09日 08:50  分类 : 《我的小黑屋》  评论

点击全文阅读


一、自定义下载文件名称

1、封装下载方法(可以通过挂载在vue实例上成为全局函数)

import requset from 'axios'// 经过请求拦截器、响应拦截器处理onloadFileName(url,method,params,fileName){request({url:url,method:method,// get 方法传参为例data:{...params},// 添加响应数据类型responseType: 'blob',// 添加文件下载特定请求头    headers: {       'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'     },}).then(res =>{// res 为响应拦截器返回的内容,大家可以对比自己的响应拦截器修改下面方法的判断if (!data) {     this.$message.warning("文件下载失败");      return;    }    // web Api种操作流文件的方法     if (typeof window.navigator.msSaveBlob !== "undefined") {     // msSaveBlob:只提供一个保存按钮     // window.navigator.msSaveBlob(new Blob([data]),`${fileName}.txt`);          // msSaveOrOpenBlob:提供保存和打开按钮     //window.navigator.msSaveOrOpenBlob(newBlob([data]),`${fileName}.txt`);     window.navigator.msSaveBlob(        new Blob([data]),        filename + ".xls"      );    } else {    // 自定义实现流文件下载      let url = window.URL.createObjectURL(new Blob([data]));      let link = document.createElement("a");      link.style.display = "none";      link.href = url;      link.setAttribute("download", fileName + ".xls");      document.body.appendChild(link);      link.click();      document.body.removeChild(link); //下载完成移除元素      window.URL.revokeObjectURL(url); //释放掉blob对象    }})}

t经过响应拦截器后返回的有效数据,所以直接使用new Blob([data])
2、调用下载方法

this.onloadFileName('xxx/xxx/xx','get',{id:'xxxxxxx'},'文件一')

二、文件名称从后端响应头数据中获取

相应拦截器处理之前的数据,文件名在content-disposition字段中存放
·1、处理响应拦截器返回的数据,将文件名暴露暴露出去

// 设置请求接受拦截器 响应拦截器中兼容处理流数据serves.interceptors.response.use(response => {  // 设置接受数据之后,做什么处理    const res = response.data     if (!res.code && res.code === 200) {     // 数据是流        if(response.headers['content-disposition']){            return {                blobData:res,                contentDisposition:response.headers['content-disposition']            }        }        // 正常情况下        else{            return res        }           }})

相应拦截器过滤后的数据描述
2、封装下载方法

onloadFileName(url,method,params){request({url:url,method:method,// get 方法传参为例data:{...params},// 添加响应数据类型responseType: 'blob',// 添加文件下载特定请求头    headers: {       'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'     },}).then(res =>{ if (!res.blobData) {            this.$message.warning("文件下载失败");              return;          }          // web Api种操作流文件的方法     if (typeof window.navigator.msSaveBlob !== "undefined") {     // msSaveBlob:只提供一个保存按钮     // window.navigator.msSaveBlob(new Blob([data]),`${fileName}.txt`);          // msSaveOrOpenBlob:提供保存和打开按钮     //window.navigator.msSaveOrOpenBlob(newBlob([data]),`${fileName}.txt`);             window.navigator.msSaveBlob(                  new Blob([res.blobData]),                  res.contentDisposition+ ".xls"              );           } else {               let url = window.URL.createObjectURL(new Blob([res.blobData],                   {                     type:                        ".xlsx"                   }                 ));                let link = document.createElement("a");                link.style.display = "none";                link.href = url;                // decodeURIComponent()解码文件名称                // data.contentDisposition.split('=')[1] 分割文件名称                const fileName = decodeURIComponent(data.contentDisposition.split('=')[1])                link.setAttribute("download",fileName);                document.body.appendChild(link);                link.click();                document.body.removeChild(link); //下载完成移除元素                window.URL.revokeObjectURL(url); //释放掉blob对象          }}

3、调用下载方法

this.onloadFileName('xxx/xxx/xx','get',{id:'xxxxxxx'})

问题一:后端返回的数据无法解析
在请求函数中添加响应类型以及响应头
在这里插入图片描述
问题二、后端返回的文件名经过相应拦截器后无法暴露出来导致无法获取文件名报错。
后端返回二进制流数据时设置请求头,添加可暴露出的字段

 response.setHeader("Access-Control-Expose-Headers", "Content-Disposition") response.setHeader("Content-Disposition", ...)

点击全文阅读


本文链接:http://m.zhangshiyu.com/post/92537.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 祖母寿宴,侯府冒牌嫡女被打脸了(沈屿安秦秀婉)阅读 -
  • 《雕花锦年,昭都旧梦》(裴辞鹤昭都)完结版小说全文免费阅读_最新热门小说《雕花锦年,昭都旧梦》(裴辞鹤昭都) -
  • 郊区41号(许洛竹王云云)完整版免费阅读_最新全本小说郊区41号(许洛竹王云云) -
  • 负我情深几许(白诗茵陆司宴)完结版小说阅读_最热门小说排行榜负我情深几许白诗茵陆司宴 -
  • 九胞胎孕妇赖上我萱萱蓉蓉免费阅读全文_免费小说在线看九胞胎孕妇赖上我萱萱蓉蓉 -
  • 为保白月光,侯爷拿我抵了债(谢景安花田)小说完结版_完结版小说全文免费阅读为保白月光,侯爷拿我抵了债谢景安花田 -
  • 陆望程映川上官硕《我的阿爹是带攻略系统的替身》最新章节阅读_(我的阿爹是带攻略系统的替身)全章节免费在线阅读陆望程映川上官硕
  • 郑雅琴魏旭明免费阅读_郑雅琴魏旭明小说全文阅读笔趣阁
  • 头条热门小说《乔书意贺宴临(乔书意贺宴临)》乔书意贺宴临(全集完整小说大结局)全文阅读笔趣阁
  • 完结好看小说跨年夜,老婆初恋送儿子故意出车祸_沈月柔林瀚枫完结的小说免费阅读推荐
  • 热推《郑雅琴魏旭明》郑雅琴魏旭明~小说全文阅读~完本【已完结】笔趣阁
  • 《你的遗憾与我无关》宋怀川冯洛洛无弹窗小说免费阅读_免费小说大全《你的遗憾与我无关》宋怀川冯洛洛 -

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1