java - 将压缩(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 并且对于其他一些数据可能会失败。
任何帮助表示赞赏
解决方案
推荐阅读
- javascript - 无法使用 ngx-image-zoom middlewre 在 Angular 6 项目中实现图像缩放功能
- kotlin - 如何使这个在我的应用程序中淡出,就像我附在这个问题上的图片一样
- xml - 当输入文件上的字段为空时,XSLT 2.0 如何跳过写入元素
- material-ui - 如何在 Material UI 中访问 Accordion Summary 中扩展的内容
- r - 使用 sample() 根据其他变量的级别创建一个新变量
- web - WCAG 3.2.2 On 网站上的输入和切换开关
- java - 仅包含对象列表的类的标准命名或模式
- sharepoint - 使用图形 API 搜索 SharePoint 项
- ssl - 证书格式不正确或证书无效错误 = 415
- c++ - “非法间接”循环遍历 C++ 中的映射