我的应用程序上的文件下载有一个非常奇怪的问题。我搜索了很长时间,并且找不到合适的解决方案。我将尽可能清楚地描述问题,希望有人可以提供帮助。
我有一个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:黑暗中的各种镜头:
编辑3:更新:在测试部署上绕过Apache,让Tomcat处理所有事情(比如在本地环境中)会使问题消失,使Apache成为主要罪魁祸首。唯一明显的区别是Apache存在的keep-alive响应头。 我一直在寻找当地环境中的Tomcat,试图找到引起问题的配置,但到目前为止还没有运气。有什么建议吗?