Java 当向客户端发送压缩(gzip)响应时,无法在IE 11中下载文件
我试图通过两个框架从应用程序下载一个文件。一个使用struts 1(旧框架),另一个使用Spring MVC(从旧框架迁移)。在Spring迁移的应用程序中,当向客户端发送压缩(gzip)响应时,显示文件无法在IE 11中下载。显示“无法下载文件”。它在chrome和旧的struts框架中都能很好地工作。此外,如果响应未被压缩,则文件将在IE和SpringMVC上成功下载。我真的无法确定原因。请求提供一些指导和帮助以识别此问题 请求头是Java 当向客户端发送压缩(gzip)响应时,无法在IE 11中下载文件,java,spring-mvc,internet-explorer,download,struts-1,Java,Spring Mvc,Internet Explorer,Download,Struts 1,我试图通过两个框架从应用程序下载一个文件。一个使用struts 1(旧框架),另一个使用Spring MVC(从旧框架迁移)。在Spring迁移的应用程序中,当向客户端发送压缩(gzip)响应时,显示文件无法在IE 11中下载。显示“无法下载文件”。它在chrome和旧的struts框架中都能很好地工作。此外,如果响应未被压缩,则文件将在IE和SpringMVC上成功下载。我真的无法确定原因。请求提供一些指导和帮助以识别此问题 请求头是 <code> Request URL:
<code>
Request URL: //edited
Request Method: POST
Status Code: 200 / OK
- Request Headers
Accept: text/html, application/xhtml+xml, image/jxr, */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US
Authorization: Basic YW3Rt2aW46dG4V3zdD5EyMz6Q=
Cache-Control: no-cache
Connection: Keep-Alive
Content-Length: 3521
Content-Type: application/x-www-form-urlencoded
Cookie: JSESSIONID=urVBPpjD3QrP6KhkqCK4r8KSAuvKFSVPdp-UXyz-FYSz4W0cQmV9sh!4524586920
Host: localhost:7001
Referer: //edited
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
</code>
下面是响应标题
<code>
Response Headers
Cache-Control: private, no-cache, no-store
Content-Disposition: attachment; filename="Closed DSP01 CRD0037_2019-12-26_133924.csv"
Content-Encoding: gzip
Content-Type: text/csv; charset=UTF-8
Date: Thu, 26 Dec 2019 08:09:23 GMT
Expires: 0
Pragma: no-cache
Transfer-Encoding: chunked
</code>
完成压缩的特定代码
<code>
if (canUseGzip) {
response.setHeader("Content-Encoding", "gzip");
GZIPOutputStream out = new GZIPOutputStream(response.getOutputStream());
pw = new OutputStreamWriter(out, "UTF-8");
} else {
pw = response.getWriter();
}
</code>
我尝试了不同的可能性,当我尝试显式设置内容长度标题时
response.setHeader("Content-Length", String.valueOf(1024));
该文件在IE中成功下载。当我搜索时,我发现传输编码和内容长度是互斥的,前者已经在响应中。我不知道为什么在这里添加内容长度是有效的,而且只有在Spring迁移的代码中才需要它。文件在较旧的struts框架上成功下载,但未提及内容长度头。
这里有什么我特别缺少的吗?还有其他永久性的解决办法吗?
另外,如何正确设置内容长度?我随机尝试了1024个,但对于其他一些数据,它可能会失败
非常感谢您的帮助您为什么要亲自抓起文件?这是您的web服务器工作。在最好的情况下,您自己的代码可能比web服务器更慢、更麻烦,因此您只是在引入债务。在最坏的情况下,你的内容会被双重包装,导致奇怪和奇妙的行为。根据我的搜索结果,我发现了这些信息。如果下载的文件与内容长度标头的大小不同,则会发生这种情况。正常情况下不应发生这种情况,除非服务器中有一个错误没有提供完整的文件,或者代理服务器切断了连接。@Boristeider也尝试过这种情况。同样的影响。在Spring迁移的代码中,文件无法下载错误显示在internet explorer上。@Deepak MSFT在这种情况下,如何在struts框架中下载文件?我只有在Spring迁移代码和IE中才有问题!设置内容长度标题解决了这个问题,但我不确定应该设置什么以及如何设置,甚至不确定它是否是强制性的。我建议您专门为IE设置内容长度,并根据您的最大文件大小进行设置,这可能有助于解决IE浏览器的此问题。为什么您自己要抓紧文件?这是您的web服务器工作。在最好的情况下,您自己的代码可能比web服务器更慢、更麻烦,因此您只是在引入债务。在最坏的情况下,你的内容会被双重包装,导致奇怪和奇妙的行为。根据我的搜索结果,我发现了这些信息。如果下载的文件与内容长度标头的大小不同,则会发生这种情况。正常情况下不应发生这种情况,除非服务器中有一个错误没有提供完整的文件,或者代理服务器切断了连接。@Boristeider也尝试过这种情况。同样的影响。在Spring迁移的代码中,文件无法下载错误显示在internet explorer上。@Deepak MSFT在这种情况下,如何在struts框架中下载文件?我只有在Spring迁移代码和IE中才有问题!设置内容长度标题可以解决此问题,但我不确定应该设置什么以及如何设置,甚至不确定它是否是强制性的。我建议您专门为IE设置内容长度,并根据您的最大文件大小进行设置,这可能有助于解决IE浏览器的此问题。