首页 > 解决方案 > 将压缩(gzipped)响应发送到客户端时,无法在 IE 11 中下载文件

问题描述

我正在尝试通过两个框架从应用程序下载文件。一个使用 struts 1(旧框架),另一个使用 Spring MVC(从旧框架迁移)。在 Spring 迁移的应用程序中,当压缩(gzipped)响应发送到客户端时,它显示文件无法在 IE 11 中下载。它显示“无法下载文件”。它在 chrome 以及较旧的 struts 框架中运行良好。此外,如果响应未压缩,文件将在 IE 以及 Spring MVC 上成功下载。我无法真正确定这里的原因。请求一些指导和帮助来确定这个问题。

请求标头是

<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 框架上成功下载,而没有提及 content-length 标头。我在这里缺少什么具体的东西吗?还有其他永久解决方案吗?另外如何正确设置内容长度?我随机尝试了 1024 并且对于其他一些数据可能会失败。

任何帮助表示赞赏

标签: javaspring-mvcinternet-explorerdownloadstruts-1

解决方案


推荐阅读