Java 当向客户端发送压缩(gzip)响应时,无法在IE 11中下载文件

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:

我试图通过两个框架从应用程序下载一个文件。一个使用struts 1(旧框架),另一个使用Spring MVC(从旧框架迁移)。在Spring迁移的应用程序中,当向客户端发送压缩(gzip)响应时,显示文件无法在IE 11中下载。显示“无法下载文件”。它在chrome和旧的struts框架中都能很好地工作。此外,如果响应未被压缩,则文件将在IE和SpringMVC上成功下载。我真的无法确定原因。请求提供一些指导和帮助以识别此问题

请求头是

<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浏览器的此问题。