在spring boot中间开发,我们经常会遇到需求要集成Excel的上传与下载,所以我们要集成excel功能,一般我们常用的就是集成POI组件。

这里不介绍如何集成POI组件和怎么生成excel的方法。而是在下载excel后,excel打不开的问题。

这一次我在spring cloud项目中就遇到生成了excel文件,然后下载到本地,打开不开,文件被损坏,而且通过修复工具无法修复。

问题复现:

1)最后下载Excel文件生成字节码,然后定义header信息,然后返回给reposnse流。

header:

   headers.setContentDispositionFormData("attachment",new String(("数据" + name + dateFormat.format(new Date()) + ".xls").getBytes("UTF-8"), "iso-8859-1"));headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

最后形成的文件流如下:

return new ResponseEntity<byte[]>(baos.toByteArray(), headers, HttpStatus.CREATED);

2) 集成到项目中,发现下载下来,文件打不开,而且通过wps修复工具,也无法完成修复。

3) 所以怀疑是不是业务数据输出不正确的问题,故删减Excel的数据,进行验证。发现问题同样存在。

4)为了干的彻底,直接生成空excel表,发现同样打不开。那和业务逻辑没有关系。

5)另外开一个spring boot demo项目,同样进行下载,发现能够打开,而且数据正常。

6)所以怀疑集成到当前项目的问题,一定是当前项目配置中对输出流格式有定义。

7)然后对spring cloud的数据设置进行查询,发现所有配置都正确(这里过程略,从流的config里面的定义)

8)既然当前项目里面的配置都是正确,为什么下载打不开呢?

9)然后开始对比下载后的文件,发现都是空文件,能够正常打开,数据是4096,而不正常数据只有4093,那问题非常明显,是这个项目把数据删减或修改了。

10)使用二进制工具,对比下这两个excel文件,发现数据完全不一样。故非常肯定是输出流问题。

11) 从生成excel的字节流对比,然后debug跟踪到response ,发现流没有改变。

12) 所以只能从spring cloud项目中来查看原因。

13) 然后从网关查询,突然发现是网关转换了流,网关在进行了一个日志拦截,对所有的流进行日志记录。

@Component
public class PrintRequestLogFilter extends ZuulFilter {private static Logger logger = LoggerFactory.getLogger(PrintRequestLogFilter.class);@Overridepublic String filterType() {return FilterConstants.POST_TYPE;}@Overridepublic int filterOrder() {return 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {try{RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();InputStream in = request.getInputStream();String reqBody = StreamUtils.copyToString(in, Charset.forName("UTF-8"));Map<String, String[]> map = request.getParameterMap();if (map != null) {StringBuilder sb = new StringBuilder();sb.append("request parameters:\t");for (Map.Entry<String, String[]> entry : map.entrySet()){sb.append("[" + entry.getKey() + "=" + printArray(entry.getValue()) + "]");}logger.info(sb.toString());}//打印json请求参数if (reqBody != null){logger.info("request body:\t" + reqBody);}//打印responseInputStream out = ctx.getResponseDataStream();String outBody = StreamUtils.copyToString(out, Charset.forName("UTF-8"));if (outBody != null){logger.info("response body:\t" + outBody);}ctx.setResponseBody(outBody);}catch (IOException e){logger.error("ZUUL日志信息输出异常:" , e);}return null;}

发现这里有一个大坑,这个大坑就是把所有的输出流给转换了。

问题找到了就好解决了。

从这个流的header里面如果是文件,就不要按照这个流进行转换了,文件下载就恢复正常了。

Excel在spring cloud项目中乱码相关推荐

  1. 告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目(实际项目开发的浓缩精华版)

    告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目 一.前言 二.如何选择版本 2.1 SpringCloud 和 Spring Boot 版本选型 2.1. ...

  2. Linux中部署Spring Cloud项目

    Linux中部署Spring Cloud项目 文章为本人在学习的过程中,记录部署过程,仅供参考学习.因本人经验不足,教程或有不妥之处,还望指正. 保姆级教程,敬请食用!!! 简介 在学习过程中,部署时 ...

  3. 在运行时在Spring Cloud Config中刷新属性配置

    在本系列Spring Cloud Config的教程系列中,我们将讨论在运行时刷新属性配置的过程,我们将使用Spring Boot致动器/refresh端点进行/refresh . 此外,我们还将研究 ...

  4. Spring Cloud项目是如何读取bootstrap.properties文件的?

    提前说明:关于Spring Cloud和Spring Boot源码分析基于的版本如下所示 <!-- Spring Dependencies --> <dependency> & ...

  5. Spring Cloud OAuth2中访问/oauth/token报Unsupported grant type: password问题的解决

    Spring Cloud OAuth2中访问/oauth/token报Unsupported grant type: password问题的解决 问题分析 问题解决 问题分析 在新建的Spring C ...

  6. Spring Cloud Kubernetes 中文文档

    本参考指南介绍了如何使用Spring Cloud Kubernetes. 1.为什么需要Spring Cloud Kubernetes? Spring Cloud Kubernetes提供了使用Kub ...

  7. Spring Cloud OAuth2中访问/oauth/token报invalid_client问题的解决

    Spring Cloud OAuth2中访问/oauth/token报invalid_client问题的解决 问题分析 问题解决 问题分析 初建Spring Cloud OAuth2项目中访问获取ac ...

  8. 用idea搭建一个Spring Cloud项目(含代码)

    目录 目标 相关术语介绍 实战 搭建父工程(聚合工程) 搭建注册中心微服务 搭建生产者和消费者微服务 新增Eureka用户认证 新增健康检测 手动维护注册列表 剔除微服务 up微服务 down微服务 ...

  9. 自己动手,使用Spring Initializr从零开始搭建Spring Cloud项目

    新建Project 这里使用的开发工具是IDEA,JDK版本1.8. 打开IDEA开发工具,File -> New -> Project 然后一步步往下设置,然后到这一步,选择Spring ...

  10. spring boot 项目源码_Spring Boot2 系列教程(三)理解 Spring Boot 项目中的 parent

    前面和大伙聊了 Spring Boot 项目的三种创建方式,这三种创建方式,无论是哪一种,创建成功后,pom.xml 坐标文件中都有如下一段引用: <parent><groupId& ...

最新文章

  1. 知识图谱基本概念工程落地常见问题
  2. Android--开发资源管理器/优化ListView显示列表方法
  3. 升级macOS新系统后,Xcode7.2 Xcode7.3.1 在新建项目界面,出现了文字错乱的情况
  4. angular复习笔记4-模板
  5. [Swift]LeetCode831. 隐藏个人信息 | Masking Personal Information
  6. 运筹说 第41期 | 运输问题硬核知识点梳理—表上作业法求解运输问题
  7. 国产版谷歌地球到底有多牛?看入行20年“老人”怎么回答
  8. QQ空间批量删除说说
  9. 关于D4RL的agent包的tf.contrib兼容性问题
  10. python分析红楼梦中人物形象_红楼梦中四个人物形象分析
  11. PhysX官方手册翻译(Dynamics)
  12. YML(YAML)语法(文件后缀为.yml格式)
  13. 阿里云装mysql选择版本_mysql学习之-三种安装方式与版本介绍
  14. E+H超声波液位计FMU41-ARB2A2
  15. 一年2k+ star -- GitHub生存之道
  16. 《深入理解计算机系统》读书笔记1
  17. 唤起手机qq、微信方法
  18. 恭喜ISO9001质量管理体系成功
  19. 农村大学生的逆袭009
  20. FFmpeg调整音视频播放速度

热门文章

  1. 敏感词库 包含中英文
  2. 海南大学信号与系统838考研经验(3)
  3. 2018年数学建模竞赛-高温作业专用服装设计
  4. 电网101、104规约解析(Java)
  5. Spring揭秘-笔记
  6. TensorFlow进阶:车牌号识别项目
  7. Copula函数理论及实现(三维)-MATLAB
  8. 通达信资金净流入公式_资金净流入公式——股票实战技术指标公式研究有缘看本博定多活30年——东方财富网博客...
  9. Redis安装教程【Windows]
  10. 微信小程序;AI智能配音助手