Jsf Web应用无法在某些浏览器上下载文件

Jsf Web应用无法在某些浏览器上下载文件,jsf,download,zip,response,Jsf,Download,Zip,Response,我的应用程序中的文件下载有一个非常奇怪的问题。我找了很长时间,没有找到合适的解决办法。我将尽可能清楚地描述这个问题,希望有人能提供帮助 我有一个JSF应用程序,在提交表单后,用户下载一个动态生成的报告,该报告由一个包含一个xls和一个csv文件的zip文件组成。zip文件的大小和生成报告的时间取决于用户选择的时间段 在服务器上,我对响应的处理方式如下: response.reset(); response.setContentType("application/zip"); response.s

我的应用程序中的文件下载有一个非常奇怪的问题。我找了很长时间,没有找到合适的解决办法。我将尽可能清楚地描述这个问题,希望有人能提供帮助

我有一个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(已删除的主机、真实文件名等)的成功报告的相关请求和响应头:

似乎可以安全地假设响应确实到达了浏览器,但不知怎么搞得一团糟,IE和FF都没有显示下载对话框

任何帮助都将不胜感激

编辑:我忘了提到,我已经尝试使用所有可用工具调试请求/响应周期:IE上的内置开发工具、FF、Firebug、Fiddler。。。不幸的是,对于受影响的浏览器来说,这不是很有用,因为响应并没有首先显示出来

编辑2:黑暗中的各种快照:

  • 请求报告后,Chrome inspector在控制台中显示此消息:资源被解释为文档,但使用MIME类型application/zip传输:“”
  • Chrome inspector在“网络”选项卡中将请求显示为“已取消”,但文件保存正确
  • 在其余页面上,响应编码为UTF-8,而zip文件的响应编码为ISO-8859-1。这似乎是一个默认值,据我所知,它没有被指定在任何地方。我让它显示“application/zip;charset=UTF-8”,但需要部署到测试服务器,以查看这是否有任何效果
编辑3:更新:在测试部署中绕过Apache,让Tomcat处理所有事情(如在本地环境中)可以消除问题,使Apache成为罪魁祸首。唯一明显的区别是Apache放在那里的keep-alive响应头。
我一直在本地环境中使用Tomcat,试图找到导致问题的配置,但到目前为止运气不佳。有什么建议吗?

您是否尝试添加适当的
内容长度
标题?您好@CBroe,我正在将动态生成的文件直接压缩到响应的输出流。据我所知,在这种情况下不可能知道文件大小。我必须将zip文件保存在磁盘上,计算文件大小,然后从磁盘流式传输文件…放弃。请参阅我关于服务器故障的回答:
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