Excel在spring cloud项目中乱码
在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项目中乱码相关推荐
- 告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目(实际项目开发的浓缩精华版)
告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目 一.前言 二.如何选择版本 2.1 SpringCloud 和 Spring Boot 版本选型 2.1. ...
- Linux中部署Spring Cloud项目
Linux中部署Spring Cloud项目 文章为本人在学习的过程中,记录部署过程,仅供参考学习.因本人经验不足,教程或有不妥之处,还望指正. 保姆级教程,敬请食用!!! 简介 在学习过程中,部署时 ...
- 在运行时在Spring Cloud Config中刷新属性配置
在本系列Spring Cloud Config的教程系列中,我们将讨论在运行时刷新属性配置的过程,我们将使用Spring Boot致动器/refresh端点进行/refresh . 此外,我们还将研究 ...
- Spring Cloud项目是如何读取bootstrap.properties文件的?
提前说明:关于Spring Cloud和Spring Boot源码分析基于的版本如下所示 <!-- Spring Dependencies --> <dependency> & ...
- Spring Cloud OAuth2中访问/oauth/token报Unsupported grant type: password问题的解决
Spring Cloud OAuth2中访问/oauth/token报Unsupported grant type: password问题的解决 问题分析 问题解决 问题分析 在新建的Spring C ...
- Spring Cloud Kubernetes 中文文档
本参考指南介绍了如何使用Spring Cloud Kubernetes. 1.为什么需要Spring Cloud Kubernetes? Spring Cloud Kubernetes提供了使用Kub ...
- Spring Cloud OAuth2中访问/oauth/token报invalid_client问题的解决
Spring Cloud OAuth2中访问/oauth/token报invalid_client问题的解决 问题分析 问题解决 问题分析 初建Spring Cloud OAuth2项目中访问获取ac ...
- 用idea搭建一个Spring Cloud项目(含代码)
目录 目标 相关术语介绍 实战 搭建父工程(聚合工程) 搭建注册中心微服务 搭建生产者和消费者微服务 新增Eureka用户认证 新增健康检测 手动维护注册列表 剔除微服务 up微服务 down微服务 ...
- 自己动手,使用Spring Initializr从零开始搭建Spring Cloud项目
新建Project 这里使用的开发工具是IDEA,JDK版本1.8. 打开IDEA开发工具,File -> New -> Project 然后一步步往下设置,然后到这一步,选择Spring ...
- spring boot 项目源码_Spring Boot2 系列教程(三)理解 Spring Boot 项目中的 parent
前面和大伙聊了 Spring Boot 项目的三种创建方式,这三种创建方式,无论是哪一种,创建成功后,pom.xml 坐标文件中都有如下一段引用: <parent><groupId& ...
最新文章
- 知识图谱基本概念工程落地常见问题
- Android--开发资源管理器/优化ListView显示列表方法
- 升级macOS新系统后,Xcode7.2 Xcode7.3.1 在新建项目界面,出现了文字错乱的情况
- angular复习笔记4-模板
- [Swift]LeetCode831. 隐藏个人信息 | Masking Personal Information
- 运筹说 第41期 | 运输问题硬核知识点梳理—表上作业法求解运输问题
- 国产版谷歌地球到底有多牛?看入行20年“老人”怎么回答
- QQ空间批量删除说说
- 关于D4RL的agent包的tf.contrib兼容性问题
- python分析红楼梦中人物形象_红楼梦中四个人物形象分析
- PhysX官方手册翻译(Dynamics)
- YML(YAML)语法(文件后缀为.yml格式)
- 阿里云装mysql选择版本_mysql学习之-三种安装方式与版本介绍
- E+H超声波液位计FMU41-ARB2A2
- 一年2k+ star -- GitHub生存之道
- 《深入理解计算机系统》读书笔记1
- 唤起手机qq、微信方法
- 恭喜ISO9001质量管理体系成功
- 农村大学生的逆袭009
- FFmpeg调整音视频播放速度