1

我有一个 servlet,它通过将 HTTP Content-Type 设置为“ application/zip”,将 Content-Disposition 设置为“ attachment”并将其写入响应来发送文件OutputStream;它在我的本地应用程序服务器上部署时表现正确,使浏览器显示弹出窗口以选择是否下载文件。

但是,当部署在集群的 jboss 服务器上时,IE 在整个传输过程中请求文件信息的速度为 0%,然后失败并显示一条错误消息,指出文件不可下载:更奇怪的是,使用 FF 和 Chrome servlet 行为正确,即与本地主机上的方式相同。

有什么线索吗?

我还可以提供一小段 servlet 代码的重要部分:

response.setContentType("application/zip; name=" + f.getName());
response.setContentLength((int)f.length());     
response.addHeader("Content-Disposition", "attachment;filename=" + f.getName());
byte[] buf = new byte[1024];
int bytesRead;
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
OutputStream os = response.getOutputStream();
while((bytesRead = bis.read(buf)) != -1) {
    os.write(buf, 0, bytesRead);                
}
os.flush();
bis.close();

我真的不知道问题出在我的 servlet 代码还是集群服务器配置中,但我开始猜测第二次机会可能是正确的……关于我的集群配置中可能出现什么问题的任何想法?

4

2 回答 2

1

这可能是这些文章中描述的 IE 行为的结果:

http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B181050

http://support.microsoft.com/default.aspx/kb/813827

我有一个类似的问题(仅适用于 Tomcat),仅当文件大小足够大时才会发生。您可以通过测量从开始下载到错误消息的时间来轻松测试是否是这种情况 - 如果该时间是恒定的,您可能会遇到相同的错误。您可能不会在本地看到错误,因为文件加载速度足够快。

如果超时是由于生成文件的时间造成的,一种解决方案是以异步方式创建文件,并在文件准备好下载后首先开始下载。

于 2009-04-24T14:16:20.580 回答
1

好的,我修好了。

位于客户端和单个集群服务器之间的负载平衡器正在向每个 HTTP 响应添加“Cache-Control: no-cache”,这导致 IE 发疯。

删除标头指令解决了这个问题。

于 2009-04-27T08:39:35.747 回答