从 Java servlet 下载 zip 包

3

我不明白为什么这么难,而且每个人都有自己的实现方法...

在我的服务器上,我生成了一个 .zip 文件,并希望用户能够在单击后下载它。

所以我设置了请求,服务器成功接收到了该请求,现在我正在努力将字节数组写入输出流。

以下是我的响应代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("Downloading clusters.zip");

        /* Generate the directory on the server, then zip it. */
        clustersToFiles();
        zipClusters();
        /* Now the zip is saved on zipFullPath */

        System.out.println("Done generating the .zip");

        String parent_dir = System.getProperty("catalina.base");
        String filename = "clusters.zip";
        String zipFullPath = parent_dir + "/" + filename;

        response.setContentType("application/zip");
        response.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");
        OutputStream out = response.getOutputStream();

        FileInputStream fis = new FileInputStream(zipFullPath);
        int bytes;
        while ((bytes = fis.read()) != -1) {
            System.out.println(bytes);
            out.write(bytes);
        }
        fis.close();
        response.flushBuffer();

        System.out.println(".zip file downloaded at client successfully");
}

2
可能是https://dev59.com/KX_aa4cB1Zd3GeqP6Ku3#23645826的重复。 - Daniel Bickler
如果你认为“框架”可以帮助我,那就请@pandaadb…… - Jack
实际上,我认为你的问题并不是servlet部分,而是复制部分。如果您愿意,我可以发布一个用于下载的jersey示例。至于框架,将任何文件复制到输出流都可以通过例如google commons来实现:'Files.copy(new File("path/to/zip/file"), output);' 另外,如果这对普通文件有效,那么您确定生成的zip文件不为空吗?尝试复制任何文件时不应该有差异。 - pandaadb
1个回答

4
下载文件是ZIP格式并不重要(除了内容类型),你只是想下载二进制文件。 PrintWriter 不适合此用途,这个写入器用于写入文本输出,并且你正在使用的 write(int) 方法是:

写入一个单一的字符

只需使用低级别的普通 OutputStream,它的 write(int) 方法是:

将指定的字节写入此输出流。

所以只需:
OutputStream out = response.getOutputStream();

您可以在这个问题中找到更多的实现方式:实现一个简单的文件下载servlet

谢谢您的时间。我已更新代码。 bytes 已经被打印出来了,所以我猜它正在工作。但是下载从未开始过。你觉得这是否与通过 AJAX 请求调用 servlet 有关? - Jack
@Jack:我真的无法确定(编辑;下面的链接应该),但首先尝试不使用ajax,以确保servlet按预期工作。哦,还有看看这个问题,它可能回答你的Ajax疑问:https://dev59.com/VXA75IYBdhLWcg3wDUco - Arnaud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接