如何通过响应OutputStream将zip文件返回到浏览器?

时间:2012-01-11 16:45:14

标签: 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.getOutputStream());

然而,目前这种方法并不正常。它不返回我创建的zip文件,而是返回一个html文件。如果我之后手动更改文件扩展名,我可以看到该文件的内容仍然是我需要的搜索结果。所以问题就在于返回响应的正确扩展。

有没有人对这种情况有任何建议?

4 个答案:

答案 0 :(得分:7)

您需要将Content-Type响应标头设置为值application/zip(或application/octet-stream,具体取决于目标浏览器)。此外,您可能希望发送指示附件状态和文件名的其他响应标头。

答案 1 :(得分:1)

在流式传输结果之前,您需要将内容类型标头设置为application/octet-stream。取决于您实际使用response的实施方式。

答案 2 :(得分:0)

以下是一些工作代码,以防万一需要它:

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>

希望这有帮助!

答案 3 :(得分:0)

所以我为此找到了一个 hack :) 只需在您的文件名中添加“.zip”并将您的内容类型设置为 application/zip。很有魅力。

response.setContentType("application/zip");
String licenseFileName = eId;
response.setHeader("Content-disposition", "attachment; filename=\"" + licenseFileName +".zip");