使用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 类型并不能解决问题。
网络上有几首曲目,但没有一首对我有用。ASP.NET
似乎有一个解决方案,但我在JAVA
中没有找到等效的解决方案。
我还尝试使用MIME类型application/vnd.ms-word
(2(,正如我在那里看到的那样,但是下载的文件仍然已损坏。MIME 类型 application/msword
(3( 的同上,一个人在这里建议,以及本论坛上提出的通用 MIME 类型 application/octet-stream
(4(。
然后,对于这四种MIME类型中的每一种,我尝试将下载文件的名称从myfile.docx
更改为myfile.doc
(不再有x(,但问题仍然存在。
那么,如何强制下载下载时未损坏的docx
文件?我的代码段是否正确?
我偶然尝试添加更多标题,实际上,Content-Length
标题解决了问题......
所以最后,我只是添加这一行来使其工作:
response.setContentLength((int) file.length());