当前位置: 首页 > 面试题库 >

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

施利
2023-03-14
问题内容

使用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
Office告诉我的)。如果尝试在存储它们的服务器上直接打开它,则不会出现该错误,这意味着下载时(而不是上传时)确实会干扰该问题。

根据IANA的说法,此类文件的MIME类型应为application/vnd.openxmlformats- officedocument.wordprocessingml.document (1) ,但是指定MIME类型不能解决问题。

Web上有很多 曲目
,但是没有一个对我有用。似乎有一个解决方案中ASP.NET,但我没有找到在等效JAVA

我也尝试使用MIME类型application/vnd.ms-word (2),*
就像我在那里看到的那样,但是下载的文件仍然损坏。一个人在这里建议使用MIME类型application/msword
(3) ,并在本论坛上提出的MIME类型 (4)
application/octet- stream
*

然后,对于这四种MIME类型中的每一种,我试图将下载文件的名称从myfile.docx更改为myfile.doc(不再是 x
),但问题仍然存在。

那么,如何强制下载 未损坏的 docx文件?我的代码正确吗?


问题答案:

我偶然尝试添加更多标头,实际上,Content-Length标头解决了该问题…

所以最后,我只需添加以下行使其起作用:

response.setContentLength((int) file.length());


 类似资料:
  • 问题内容: 一切正常,但是只有当文件很小(大约1MB)时,当我尝试使用更大的文件(例如20MB)时,我的浏览器将其显示,而不是强制下载,到目前为止,我尝试了许多标头,现在我的代码看起来像: 问题答案: 在将文件内容写入输出流之后,你将设置响应头。在响应生命周期中设置标头很晚。正确的操作顺序应该是首先设置头,然后将文件的内容写入servlet的输出流。 因此,你的方法应编写如下(由于仅是表示形式,因

  • 问题内容: 我有以下代码将页面附件带给用户: 问题是所有受支持的文件都可以正常工作(jpg,gif,png,pdf,doc等),但是.docx文件在下载时已损坏,需要通过Office进行修复才能打开。 起初我不知道问题是否出在解压缩包含.docx的zip文件,所以我没有保存输出文件,而是先保存了文件,然后成功打开了文件,所以我知道问题所在应该在回应写作中。 你知道会发生什么吗? 问题答案: 我也遇

  • 我的项目是一个web应用程序。 目前,它有一种生成文本文件并将其发送到客户端浏览器下载的方法。 我需要修改它,以强制浏览器将文件保存在客户端计算机上的自定义(预定义)位置。

  • 我试图通过调用Spring RESTendpoint在Reactjs中下载Excel文件,但我遇到了损坏文件的问题。 回应呼叫... Spring控制器…… 服务 当我执行上面的代码,我得到一个Excel文件o. k……但看response.data看起来像…… 嘎嘎��由于数据不可读,无法打开文件。打开服务器上创建的文件是可以的 欢迎任何想法 干杯

  • 我编写的下载文件的方法总是产生损坏的文件。 我通过adb访问这些文件,将它们传输到我的sccard,在那里我看到它们似乎有合适的大小,但没有根据例如Linux命令的类型。 你知道丢失了什么以及如何修复它吗? 谢谢。 代码的简单版本(但错误相同) 日志:< code > file . length:2485394 | content length:1399242 问题是,我从我的API单例中获得了,