Java下载通过添加一个字符

时间:2017-08-29 17:08:10

标签: java jsp servlets download

我的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.wordprocessing‌​ml.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(十六进制)

如果我使用十六进制编辑器删除这个额外的字符,那么该文件就可以正常打开。

为什么要添加这个额外字符?

1 个答案:

答案 0 :(得分:4)

你的循环错了。在写完最后一个实际字节后,in.read()仍然包含它,输入循环,-1读取0xFF并将其写出来,从而产生额外的-1(即{ {1}})byte。

更改循环以在写出之前检查读取的内容,如下所示

while((bit = in.read()) != -1) {
    outs.write(bit);
}