2017-08-29 96 views
0

我的Web应用程序运行Tomcat 8. .docx文件已正确上载到服务器,并使用jsp中包含的以下Java代码进行下载。Java下载通过添加一个字符损坏.docx文件

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(十六进制)

如果我用十六进制编辑器删除这个额外的字符,那么文件打开罚款。

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

+0

你不应该使用'JSP'下载的二进制文件。改写一个servlet。 – Xvolks

+0

我知道 - 这是我没写的旧代码。你认为这是问题的根源,还是你只是提出了良好的编程习惯? – gordon613

+0

最佳做法。过去我已经做过这样丑陋的事情,并且我学会了不这样做的艰难方式。 – Xvolks

回答

4

您的循环错误。最后的实际字节写入后,bit仍含有它,进入循环,in.read()读取-1并将其写出,导致额外的0xFF(即-1)字节。

更改您的循环来检查写出来之前,什么内容如下

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