我有一个 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 代码还是集群服务器配置上,但我开始猜测第二次机会可能是正确的...任何关于什么地方可能出错的想法我的集群配置?
最佳答案
这可能是这些文章中描述的 IE 行为的结果:
http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B181050
http://support.microsoft.com/default.aspx/kb/813827
我有一个类似的问题(只有 Tomcat),只有当文件足够大时才会发生。您可以通过测量从开始下载到错误消息的时间来轻松测试是否是这种情况 - 如果该时间是恒定的,则您可能会遇到相同的错误。您可能不会在本地看到错误,因为文件加载速度足够快。
如果超时是由于生成文件的时间导致的,一种解决方案是以异步方式创建文件,并在文件准备好下载后首先开始下载。
关于internet-explorer - 集群服务器上的文件下载 servlet 与 IE 的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/785948/