Site Overlay

Transfer-Encoding:chunked导致下载文件损坏的问题

前几天帮助同学解决一个归档文件模版填充并下载的功能,使用了poi-tl组件,但是在最终调试的时候发现下载之后的文件,Microsoft Office 会提示 “文件损坏”,使用兼容模式打开,内容正常。而 WPS 的话,打开乱码。 很明显,文件内容损坏。

一、利用搜索浏览器解决

一开始,我搜索的是“poi处理文件导致兼容性问题”,结果发现人家的问题,和我的一点关系也没有。当时因为看到有太多的相关性例子,所以导致大量的时间花到了搜索上去,试图搜索到一些解决方案。

二、怀疑自己的代码有问题

文件处理以及下载的代码,都是按照从官方给出的文档里步骤来的。我担心是最新的jar包出现了问题。所以我就从github下载了别人正常使用的项目到本地测试。发现虽然有些用法不一样,但别人的项目,产生的文件都是正确的。 于是我开始调试多个版本的jar包。最后发现jar包没有任何的问题。本地测试产生的文件,也没有任何的问题。

我比对了本地产生的文件和项目运行以后下载的文件,发现文件大小发生了变化。 在线下载的文件,大小只有正常文件的 20%多一点。

三、怀疑下载的过程导致文件内容缺省

因为在官方github仓库的 issue里发现,有人说下载的时候,如何计算下载的文件内容长度。我怀疑下载的时候长度标识导致文件下载失败(请求返回的http header里Content-Length 导致文件下载失败)。于是我搜索了一下 “Content-Length 导致文件下载失败”,发现确实有这样的问题。

四、解决问题

我改掉了官方文档里给的下载的代码,计算了下载长度,并且在 header里赋值。接收到的文件,已然没了问题。

五、比对 Response Header,找出原因

发现两者header里,有两个差异:就是 Content-Length 和 Transfer-Encoding。 两者的关系是不能共存,两者都设置的时候,Transfer-Encoding起作用。 但我并没有设置Transfer-Encoding,于是我又搜索一下原因,发现https://www.cnblogs.com/ywliang/p/4530604.html,原来是我利用流下载文件的时候,使得SpringBoot 内置的Tomcat把header里加入了Transfer-Encoding。 导致文件下载失败。

六、进一步怀疑

因为 Transfer-Encoding:chunked 表示内容会分块传输,且内容结束有明显的特征。 但下载的文件内容缺省。 感觉是分块的时候,导致分成的块里含有了结束的特征。导致接收端处理失败。 具体的原因,以后有机会的话可以测试一下。

  • poi-tl:是国人写的利用docx模板文件生成正式文档的组件
0

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据