Java 如何通过响应输出流将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.

在这种情况下,我创建了一个包含搜索结果文件的zip文件,并试图将其发送给用户。下面是我目前正在尝试使用的代码块

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呢?然后发送到响应。