poi导出excel打开文件时部分内容有问题
问题描述:JavaWeb项目,ssm框架,从tomcat9.0.30换到weblogic10.3.6.0后,poi导出excel,打开文件时部分内容有问题;
解决:
response.addHeader("Content-Length", "" + outfile.length());
替换成:
response.setHeader("Content-Length", "" + outfile.length());
分析一:
addHeader方法添加两个完全一样的信息时,总是为响应增加新的头部;
setHeader()添加两个完全一样的信息时,总是用新值去替换旧值;
分析二:
我用F12看了我这个下载方法的响应头:
Response Headers:
Content-Disposition: attachment;filename=项目设置-1592298665653.xlsx
Content-Length: 4909
Content-Type: application/octet-stream
Date: Tue, 16 Jun 2020 09:11:05 GMT
Transfer-Encoding: chunked
在setHeader方法中,并没有最后标红的Transfer-Encoding: chunked,而在addHeader方法中是有这个字段的;
(这:我的response中并没有设置Transfer-Encoding这个字段,setHeader也只是覆盖了Content-Length,这是为什么。。。我tm太菜了嘛。。。)
分析三:
这次只能分析Transfer-Encoding: chunked了:
分块编码(Transfer-Encoding: chunked)
1、Transfer-Encoding,是一个 HTTP 头部字段(响应头域),字面意思是「传输编码」。最新的 HTTP 规范里,只定义了一种编码传输:分块编码(chunked)。
2、分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由网页服务器发送给客户端的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。
3、数据分解成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小。
4、具体方法
a)在头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。这时,报文中的实体需要改为用一系列分块来传输。
b)每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的 CRLF(\r\n),也不包括分块数据结尾的 CRLF。
c)最后一个分块长度值必须为 0,对应的分块数据没有内容,表示实体结束。
big old: 看懂了吗?
me: 没有
big old: 呵呵(sb)
大概意思是说:这东西是http的数据传输机制,一块块的传,不用考虑发送内容的总大小;
me: 但是为什么生成的文件比不加Transfer-Encoding: chunked大了些,以至于打开文件时部分内容有问题(明明addHeader方法也设置了Content-Length)?
big old:
参考文章1:https://www.cnblogs.com/raychou1995/p/10201878.html
参考文章2:https://www.jianshu.com/p/da01a20a515e
我也不知道为啥了,big old 来捶我吧!