我的应用程序上的文件下载有一个非常奇怪的问题。我搜索了很长时间,但找不到合适的解决方案。我将尝试尽可能清楚地描述问题,希望有人可以提供帮助。
我有一个 JSF 应用程序,在提交表单后,用户下载一个动态生成的报告,该报告由一个包含一个 xls 和一个 csv 文件的 zip 文件组成。zip 文件的大小和生成报告的时间取决于用户选择的时间段。
在服务器上,我这样处理响应:
response.reset();
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment;filename=\"file.zip\"");
然后我在服务器上的临时目录(每个会话唯一)上生成 csv 和 xls 文件,并将它们直接压缩到响应输出流。
为搜索条件选择较短的时间段时,一切都很好。但是当增加时间间隔时,IE 和 Firefox 似乎“失去”了响应。在 IE 上,请求保持“待处理”,而 FF 在选项卡上显示“正在连接”微调器,即使服务器已完成将文件写入响应。在任何情况下,服务器日志中都没有例外。下载对话框永远不会出现。
令我困惑的是,无论搜索条件如何,Chromium 每次都成功打开文件而没有问题。此外,问题似乎来自测试部署,因为我无法通过设置断点并等待几分钟等方式在本地环境中重现该问题。
等待时间和文件大小不是这个世界的东西,我说的是不到 1MB 和不到 2 分钟即可完成报告。
以下是使用 FF 成功报告的相关请求和响应标头(已删除主机、真实文件名等):
Request:
User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:19.0) Gecko/20100101 Firefox/19.0
Connection:keep-alive
Accept-Language:en-US,en;q=0.5
Accept-Encoding:gzip, deflate
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Response:
Transfer-Encoding:chunked
Server:Apache/2.2.3 (CentOS)
Keep-Alive:timeout=10, max=98
Expires:Mon, 08 Apr 2013 11:43:49 GMT
Date:Mon, 08 Apr 2013 11:43:48 GMT
Content-Type:application/zip;charset=ISO-8859-1
Content-Disposition:attachment;filename="file.zip"
Connection:Keep-Alive
Cache-Control:max-age=1
假设响应确实到达浏览器似乎是安全的,但不知何故被搞砸了,IE 和 FF 都没有显示下载对话框。
任何帮助将不胜感激。
编辑:我忘了提到我已经尝试使用每个可用的工具调试请求/响应周期:IE、FF、Firebug、Fiddler 上的内置开发工具......不幸的是,对于受影响的浏览器不是很有用,因为响应没有出现在第一位。
编辑2:黑暗中的各种镜头:
- Chrome 检查器在请求报告后在控制台中显示此消息:资源解释为文档,但使用 MIME 类型应用程序/zip 传输:“ https://xxxxxxx.xxx/xxxxx.faces ”。
- Chrome 检查器在“网络”选项卡中将请求显示为“已取消”,但它会正确保存文件
- 在其余页面上,响应编码为 UTF-8,但 zip 文件为 ISO-8859-1。这似乎是一个默认值,据我所知,它没有在任何地方指定。我让它显示“application/zip;charset=UTF-8”,但需要部署到测试服务器以查看这是否有任何效果。
编辑 3:更新:在测试部署中绕过 Apache,让 Tomcat 处理所有事情(就像在本地环境中一样)使问题消失,使 Apache 成为罪魁祸首。唯一明显的区别是 Apache 放在那里的 keep-alive 响应标头。我一直在本地环境中使用 Tomcat,试图找到导致问题的配置,但到目前为止还没有运气。有什么建议么?