ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

poi导出excel打开文件时部分内容有问题

2020-06-16 18:06:04  阅读:1141  来源: 互联网

标签:poi HTTP 分块 Transfer excel 导出 Content Encoding chunked


问题描述: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 来捶我吧!

 

标签:poi,HTTP,分块,Transfer,excel,导出,Content,Encoding,chunked
来源: https://www.cnblogs.com/steveshao/p/13143409.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有