我写了一个servlet来下载文件。它适用于某些文件,但对于其他文件,操作系统过早关闭,我最终下载了一个空白文件。
File file = new File(fileName);
InputStream fis = new FileInputStream(file);
resp.setHeader("Content-Type", "text/plain");
resp.setHeader("Content-Disposition", "attachment; filename=\"" + fileName );
resp.setDateHeader("Expires",0);
resp.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
resp.setHeader("Pragma", "public");
resp.setContentLength((int) file.length());
resp.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
ServletOutputStream os = resp.getOutputStream();
byte[] bufferData = new byte[1024];
int read = 0;
while((read = fis.read(bufferData))!= -1){
System.out.println("read " + read + " chars");
os.write(bufferData, 0, read);
}
os.flush();
os.close();
fis.close();
当我调试时,我可以看到它试图将第一个缓冲区的数据写入os,然后在浏览器端,下载对话框弹出一个空白文件。在servlet中,我在下一个缓冲区写入时得到一个IOClosed。
我尝试使用IOUtils.copy(fis,resp.getOutputStream());
得到同样的错误。
任何原因某些类型的文件数据都会迫使os过早关闭?我能保护它吗?