今天在项目上遇到了一个问题,就是后端接口返回excel文件流,然后前端实现下载excel,前端下载的excel文件居然无法打开!

在网上搜索了很多对应的资料,也尝试了很多办法,还是没能解决,最后在这篇文章上面找到了解决的办法:http://t.csdn.cn/0u4aC  ,然后我也总结了一下,希望能帮助到有希望的人!

我这个项目在客户端和后端之间还隔着一层node层,下面简单介绍一下后端返回文件流,前端实现下载excel的整体流程:

下面介绍主要的实现代码:

前端代码:

   axios.post('/api/manage/downloadDataRecords', {}, { responseType: 'arraybuffer' }).then(res => {const blob = new Blob([res.data],{type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'},)const objUrl = URL.createObjectURL(blob);const eleLink = document.createElement('a');eleLink.download = '报表数据-${new Date().getTime()}.xlsx';eleLink.style.display = 'none';eleLink.href = objUrl;document.body.appendChild(eleLink);eleLink.click();document.body.removeChild(eleLink);})

注意:一定要设置responseType的值为arraybuffer

node层的代码:

// 下载
router.all('/data/download(.*)', async (ctx, next) => {const body = ctx.request.body;const method = ctx.request.method;const path = ctx.request.url;try {let res;if (method === 'GET') {res = await axios.get(`${remoteUrl}${path}`, {headers: {'Content-Type': 'application/json;charset=UTF-8'},responseType: 'arraybuffer',timeout: 6000,});} else if (method === 'POST') {res = await axios.post(`${remoteUrl}${path}`, body, {headers: {'Content-Type': 'application/json;charset=UTF-8'},responseType: 'arraybuffer',timeout: 6000,});}/*** 可以在这里打印一下,看看后端接口返回的content-type是否是application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8* 如果不是则会导致下载的excel文件无法正常打开* */// console.log('====headers', res.headers); ctx.res.writeHead(200, {// 注意:后端接口响应头中的内容类型content-type必须是application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8,否则下载的文件无法正常打开'Content-Type': res.headers['content-type'],'Content-Disposition': res.headers['content-disposition'], // 后端接口返回的文件名称});// ctx.body = res.data;ctx.res.end(res.data, 'binary');} catch (e) {ctx.body = e?.response?.data || e.code;}
});

 注意:一定要设置responseType的值为arraybuffer

上面就是具体实现的代码了,主要的地方就是设置axios的responseType的值为arraybuffer,还有就是需要注意一下后端接口响应体中的content-type是否是application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8,否则下载的excel文件无法打开或者乱码。如果有什么问题疑问,欢迎在下方留言一起讨论!

nodejs调用后端接口返回excel文件流,nodejs再转发前端实现下载excel相关推荐

  1. vue 后台返回的文件流进行预览_vue实现下载文件流完整前后端代码

    这篇文章主要为大家详细介绍了vue实现下载文件流完整前后端代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 使用Vue时,我们前端如何处理后端返回的文件流 首先后端返 ...

  2. 文件下载后端返回base64文件流,使用a标签下载

    后端接口返回base64文件流 <a@click="downloadFiles(item.fileName, item.url)">{{ item.fileName } ...

  3. SpringBoot+Vue下载Excel文件流(No converter、Excel乱码)

    目录 介绍 No converter Excel乱码 正确代码 后端代码 前端代码 方法1 方法2 方法3 介绍 后端使用SpringBoot.Mybatis Plus,前端使用Vue,进行Excel ...

  4. Java实现Excel下载,excel文件流输出到浏览器

    关于实现Excel下载,我使用的是easypoi, easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员就可以方便的写出Excel导出,Excel模板导出,Excel导 ...

  5. js下载get请求返回的文件流(请求头携带token)

    需求是下载请求接口返回的文件流 var xhh = new XMLHttpRequest(); xhh.open("get", baseUrl+'/cert/download?na ...

  6. 前端处理后端返回的excel文件流并下载

    项目中遇到上传excel,后端写的接口是当重复上传相同信息的excel时会吐出excel二进制文件流,这种文件流需要前端下载供用户看. 首先后端的接口需要上传文件已formData形式上传 这里我用的 ...

  7. 后端返回PDF文件流,前端处理展示及打印

    国庆突如其来的加班q.q,上午接到的需求,只能起床啦 自己也是第一次接触这种业务需求,进行了一顿cv大法,网上有很多版本,个人学习借鉴(cv)了一下,在这里做个学习记录,欢迎各位指正优化,参考学习,如 ...

  8. 读取EXCEL文件数据,再调用第三方接口,将第三方数据重新写入到EXCEL文件

    读取EXCEL文件数据,再调用第三方接口,将第三方数据重新写入到EXCEL文件 工作中涉及很多提供文档数据,少则几条,多则上万,少的可以自己编辑一个,静态final来自己定义,一旦数太多得话,就得使用 ...

  9. js接收excel文件流并解析下载文件

    情景:后端为post请求,且接口返回为excel文件流 方法: 1.使用原生XMLHttpRequest 2.使用原生fetch 3.使用axios import qs from 'qs'import ...

最新文章

  1. 接口冲突的一种解决方法
  2. 【Matlab 控制】函数调用函数
  3. Python 网络爬虫笔记11 -- Scrapy 实战
  4. 嵌入式实时操作系统的基本概念——μ/COS-II读书笔记
  5. wxWidgets:实现框架构造器
  6. James Shore:敏捷的衰落
  7. 详析 Kubernetes 在边缘计算领域的发展
  8. 【OJ】洛谷分支结构题单题解锦集
  9. hibernate id生成策略 mysql_Hibernate中ID生成策略
  10. 记一次 Ubuntu Linux 动态调整分区空间
  11. 基于BOW模型的图像检索
  12. 矩形窗、汉明窗、汉宁窗的频率响应图
  13. 计算机pe启动蓝屏怎么办,进pe蓝屏解决方法
  14. 2018最新版省市区三级联动数据
  15. 原生方式android 商城,WooCommerce商城原生android完整客户端源码(CiyaShop)
  16. 【实战】(字节跳动、日本东京大学)学习使用白盒表示+GAN来创作卡通图片:Learning to Cartoonize Using White-Box Cartoon Representations
  17. 一站式原创文章神器,让你轻松创作高质量文章
  18. this.name=name;中两个name都是什么意思?
  19. android 仿微信 视频播放器,Android仿微信多媒体选择器 - SmartMediaPicker
  20. 用python搭建 百万答题 、自动百度搜索答案

热门文章

  1. ldpc matlab verlog,LDPC编码Verilog代码
  2. 多种音频文件(.wav, .mp3, .ogg)转化为wav文件,支持分、秒级别切分
  3. JAVA 网络编程基础
  4. 怎么把webp文件转换为jpg?这几种方法值得学习!
  5. 2021年平面设计流行趋势
  6. 你好,法语!A2知识点总结(2)
  7. Python自动化刷投票脚本开发,微信投票再也不需要发红包了
  8. Autodesk.ArtCAM.Premium.2017.Suite.build110.Multilang.Win64 1DVD
  9. Echarts 饼状图实现自动高亮扇面
  10. 【微信小程序】字符串转数字