文件下载servlet与群集服务器上的IE表现不同

时间:2009-04-24 13:56:02

标签: internet-explorer http servlets jboss cluster-computing

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

但是,当在集群jboss服务器上进行部署时,IE会挂起0%请求整个传输的文件信息,然后失败,并显示一条错误消息,指出该文件无法下载:即使是陌生人也是如此FF和Chrome的servlet行为正确,就像在localhost上一样。

任何线索?

我还可以提供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代码或群集服务器配置中,但我开始猜测第二次机会可能是正确的...任何关于什么可能出错的想法我的群集配置?

2 个答案:

答案 0 :(得分:1)

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

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

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

我遇到了类似的问题(仅限Tomcat),只有在文件大小足够大的情况下才会出现问题。您可以通过测量从开始下载到错误消息的时间来轻松测试是否是这种情况 - 如果该时间不变,则可能存在相同的错误。您不可能在本地看到错误,因为文件加载速度足够快。

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

答案 1 :(得分:1)

好的,我修好了。

站在客户端和各个群集服务器之间的负载均衡器正在为每个HTTP响应添加“Cache-Control:no-cache”,这导致IE生气。

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