我有一个java servlet,它使用ServletOutputStream将二进制文件从应用程序服务器传输到浏览器。执行此操作的代码已经推出了相当长的时间,并且在绝大多数情况下都能正常运行。我的用户报告了一个只出现在firefox中的奇怪问题。在ServletOutputStream完成发送文件之后,firefox将标准firefox窗口中的文件显示为乱码文本字符串,而不是提示用户选择他们想要使用的应用程序。任何一个文件或文件类型都不会始终如此。我个人已经看过它发生过一次,但是当我再次尝试下载文件时,它运行正常。一些使用firefox的用户更频繁地报告问题。不幸的是,没有任何例外被扔到任何日志中,我似乎无法自信地重现它。
应用程序在Java 6和tomcat 6上运行,并且由apache提供。关于可能发生的事情或如何排除故障的任何想法?
代码:
File target = file.getAttachment();
response.setContentType(file.getMimeType());
response.setContentLength(new Long(file.getFileSize()).intValue());
response.addHeader("Content-Disposition", "attachment; filename=" + file.getFileName() + ".foo;");
response.addHeader("Cache-Control", "max-age=0");
ServletOutputStream stream=response.getOutputStream();
BufferedInputStream fif=new BufferedInputStream(new FileInputStream(target));
int data;
int counter = 0;
try {
while((data=fif.read())!=-1) {
stream.write(data);
//System.err.println("A counter: " + counter);
counter++;
//if (counter > 249000) {
//throw new Exception("Foo this bar!");
//}
}
System.err.println("counter: " + counter);
} catch(SocketException x) {
// catch socket reset by peer errors here, and ignore them.
x.printStackTrace();
}
fif.close();
stream.close();