使用JAVA,我试图强制浏览器下载文件。
这是我当前使用的代码:
response.reset();
response.resetBuffer();
response.setContentType(mimeType);
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
InputStream in = new FileInputStream(file);
OutputStream out = response.getOutputStream();
IOUtils.copy(in, out);
out.flush();
out.close();
in.close();
response.flushBuffer();
它几乎工作得很好,但是当强制下载docx
文档(MS Office 2007+)时,下载的文件被损坏(至少,MS是这样的)办公室告诉我)。如果我尝试直接在存储它们的服务器上打开它,则不会出现该错误,这意味着该问题确实会在下载时(而不是上传时)产生干扰。
根据IANA ,此类文件的 MIME 类型应为 application/vnd.openxmlformats-officedocument.wordprocessingml.document
(1),但指定 MIME 类型并不能解决问题.
网络上有一些轨道,但没有一个对我有用。好像有一个solution在 ASP.NET
中,但我没有在 JAVA
中找到等效项。
我还尝试使用 MIME 类型 application/vnd.ms-word
(2) 正如我看到的 there ,但下载的文件仍然损坏。同上,MIME 类型 application/msword
(3) 一个人建议 here ,以及对于 this forum 上提出的通用 MIME 类型 application/octet-stream
(4) .
然后,对于这四种 MIME 类型中的每一种,我尝试将下载文件的名称从 myfile.docx
更改为 myfile.doc
(没有 x 了),但问题仍然存在。
那么,如何强制下载下载时未损坏 docx
文件?我的这段代码正确吗?
最佳答案
我偶然尝试添加更多 header ,事实上,Content-Length
header 解决了问题...
最后,我只需添加这一行即可使其正常工作:
response.setContentLength((int) file.length());
关于java - 在JAVA中强制浏览器下载docx文件会生成损坏的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10431317/