java - 在JAVA中强制浏览器下载docx文件会生成损坏的文档

标签 java ms-office mime-types docx force-download

使用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 类型并不能解决问题.

网络上有一些轨道,但没有一个对我有用。好像有一个solutionASP.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/

相关文章:

c# - 使用 C# 在 Excel 中更改单元格颜色

css - 在 spring-boot 应用程序中获取用于下载字体文件 (ttf) 的弹出窗口

ruby - 在 Ruby/Rails 中清理文件名

java - 如何读取文件 : Properties > Details > Content > Pages e. g。对于word文档

java - 使用Web Client java抓取网站多个页面

java - 我可以运行 Hadoop onflow (在应用程序运行时运行 Map Reduce)

mime-types - Dropbox 上的 Javascript 和 CSS 问题(mime 类型)

java - 是否必须有 doGet 或 doPost 方法?

php - 基于 Linux 的 MS Office 缩略图生成

java - 通过代码签署 Office 文档(带证书)