使用ZipOutputStream将包含多个.csv文件的.zip文件返回到浏览器



首先,我很清楚Stack OverFlow上也有类似的主题,但这个主题不能回答我的问题。这就是我发这个帖子的原因。

目前,我的程序能够搜索到";。csv";本地文件,根据某些标准,将它们添加到列表中,然后在"中创建文件;。zip";格式,其中包含所有这些文件。这样做没有任何问题。

现在,我想下载这个"。zip";文件,从Web界面,通过按钮。代码和按钮之间的连接是有效的,但当我打开下载的"时;。zip";文件,它只包含一个文件,而不是所有的";。csv";它应该包含的文件。问题从哪里来?

这是我的代码:

FileOutputStream baos = new FileOutputStream("myZip.zip");
ZipOutputStream zos = new ZipOutputStream(baos);

for(String sCurrent : selectedFiles){
zos.putNextEntry(new ZipEntry(new File(sCurrent).getName()));
Files.copy(Paths.get(sCurrent), zos);
zos.closeEntry();
}
zos.close();
response.getOutputStream().flush();
response.getOutputStream().close();

发送响应后,您将关闭ZIP。交换订单:

zos.close();
response.getOutputStream().write(baos.toByteArray());

如果您使用try-with-resources来处理关闭,Files.copy(Paths.get(currentFile), zos);来传输文件,并且如果您直接将ZIP压缩到输出流,则效率会更高,因为对于大文件,可能会出现内存不足的异常:

ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());

与其说是一个答案,不如说是基于@DuncG 的整合

ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
for (String path : selectedFiles) {
zos.putNextEntry(new ZipEntry(new File(path).getName()));
Files.copy(Paths.get(path), zos);
zos.closeEntry();
}
zos.close();

最新更新