Java 如何通过响应输出流将zip文件返回到浏览器?
在这种情况下,我创建了一个包含搜索结果文件的zip文件,并试图将其发送给用户。下面是我目前正在尝试使用的代码块Java 如何通过响应输出流将zip文件返回到浏览器?,java,zip,outputstream,Java,Zip,Outputstream,在这种情况下,我创建了一个包含搜索结果文件的zip文件,并试图将其发送给用户。下面是我目前正在尝试使用的代码块 File[] zippable = new File[files.size()]; File resultFile = ZipCreator.zip(files.toArray(zippable), results); InputStream result = new FileInputStream(resultFile); IOUtils.copy(result, response.
File[] zippable = new File[files.size()];
File resultFile = ZipCreator.zip(files.toArray(zippable), results);
InputStream result = new FileInputStream(resultFile);
IOUtils.copy(result, response.getOutputStream());
然而,这目前并不完全正确。它不是返回我创建的zip文件,而是返回一个html文件。如果我以后手动更改文件扩展名,我可以看到文件的内容仍然是我需要的搜索结果。所以问题就在于返回响应的适当扩展
有人对这种情况有什么建议吗?在对结果进行流式处理之前,需要将内容类型标题设置为
application/octet stream
。取决于您正在使用的响应的实现方式,具体取决于您实际执行此操作的方式。您需要将内容类型
响应头设置为值应用程序/zip
(或应用程序/octet流
,具体取决于目标浏览器)。此外,您可能需要发送额外的响应头,指示附件状态和文件名。以下是一些工作代码,以防任何人需要它:
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
// The zip file you want to download
File zipFile = new File(zipsResourcesPath + zipFileName);
response.setContentType("application/zip");
response.addHeader("Content-Disposition", "attachment; filename=" + zipFileName);
response.setContentLength((int) zipFile.length());
try {
FileInputStream fileInputStream = new FileInputStream(zipFile);
OutputStream responseOutputStream = response.getOutputStream();
int bytes;
while ((bytes = fileInputStream.read()) != -1) {
responseOutputStream.write(bytes);
}
} catch (IOException e) {
logger.error("Exception: " + e);
}
}
以及HTML:
<a class="btn" href="/path_to_servlet" target="_blank">Download zip</a>
希望这有帮助 我想我可能在这里误解了你。我在代码中添加了一行,现在它的内容是response.setHeader(“Content-Type”,“application/zip”)代码>仍然没有成功。此调用是在调用IOUtils之前进行的。copy@Bennie:看起来不错,但是对于ZIP文件使用的“正确”MIME类型,仍然存在一些混淆,因此您可能希望使用这些值。好的,看起来它现在正在工作,至少对于返回文件来说是这样。但它做了一件奇怪的事情,文件名为“exportZipSearchResults.htm.zip”。是否有一种内置的方法来更改响应上的文件名?@Bennie:尝试使用(可能带有值“inline”)和您选择的文件名。请说明如何定义“zipFile”?您是如何将文件添加到此“zipFile”中的?我已经编辑了代码,以便您可以查看zipFile是如何定义的。请重新考虑一下Yithirash的否决票。我感谢您的评论,因为这有助于我改进我的答案。这是已经创建的zip文件。但是如何使用Java获取多个文件并将它们转换成zip呢?然后发送到响应。