我的Web应用程序运行Tomcat 8。 .docx文件已正确上载到服务器,并使用jsp中包含的以下java代码下载。
File f = new File (Monitor.getPropertyValue("myDir") + (request.getParameter("file")) );
String filename=request.getParameter("original");
response.setContentLength((int) f.length());
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
response.setHeader ("Content-Disposition", "attachment; filename="+filename);
InputStream in = new FileInputStream(f);
ServletOutputStream outs = response.getOutputStream();
int bit = 256;
int i = 0;
try {
while ((bit) >= 0) {
bit = in.read();
outs.write(bit);
}
}
catch (IOException ioe) {
ioe.printStackTrace(System.out);
}
outs.flush();
outs.close();
in.close();
但是当我尝试打开下载的文件时,它已损坏且Word无法打开它(不先修复它)
当我比较原始文件和下载的文件时,我注意到下载的文件末尾有一个额外的字符 - FF(十六进制)
如果我使用十六进制编辑器删除这个额外的字符,那么该文件就可以正常打开。
为什么要添加这个额外字符?
答案 0 :(得分:4)
你的循环错了。在写完最后一个实际字节后,in.read()
仍然包含它,输入循环,-1
读取0xFF
并将其写出来,从而产生额外的-1
(即{ {1}})byte。
更改循环以在写出之前检查读取的内容,如下所示
while((bit = in.read()) != -1) {
outs.write(bit);
}