【发布时间】:2015-03-13 05:27:28
【问题描述】:
我想创建 .zip 文件,其中包含我从后端收到的压缩文件,然后将此文件发送给用户。这2天我一直在寻找答案,但找不到合适的解决方案,也许你可以帮助我:)
现在,代码是这样的:(我知道我不应该在spring控制器中做所有的事情,但不要关心它,它只是为了测试目的,找到方法让它工作)
@RequestMapping(value = "/zip")
public byte[] zipFiles(HttpServletResponse response) throws IOException{
//setting headers
response.setContentType("application/zip");
response.setStatus(HttpServletResponse.SC_OK);
response.addHeader("Content-Disposition", "attachment; filename=\"test.zip\"");
//creating byteArray stream, make it bufforable and passing this buffor to ZipOutputStream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(byteArrayOutputStream);
ZipOutputStream zipOutputStream = new ZipOutputStream(bufferedOutputStream);
//simple file list, just for tests
ArrayList<File> files = new ArrayList<>(2);
files.add(new File("README.md"));
//packing files
for (File file : files) {
//new zip entry and copying inputstream with file to zipOutputStream, after all closing streams
zipOutputStream.putNextEntry(new ZipEntry(file.getName()));
FileInputStream fileInputStream = new FileInputStream(file);
IOUtils.copy(fileInputStream, zipOutputStream);
fileInputStream.close();
zipOutputStream.closeEntry();
}
if (zipOutputStream != null) {
zipOutputStream.finish();
zipOutputStream.flush();
IOUtils.closeQuietly(zipOutputStream);
}
IOUtils.closeQuietly(bufferedOutputStream);
IOUtils.closeQuietly(byteArrayOutputStream);
return byteArrayOutputStream.toByteArray();
}
但问题是,使用代码,当我输入 URL:localhost:8080/zip 时,我得到文件:test.zip.html 而不是 .zip 文件
当我删除 .html 扩展名并仅保留 test.zip 时,它会正确打开如何避免返回此 .html 扩展名?为什么要添加?
我不知道我还能做什么。我也尝试用类似的东西替换 ByteArrayOutputStream:
OutputStream outputStream = response.getOutputStream();
并将方法设置为 void 所以它什么都不返回,但是它创建了.zip 文件,它是..损坏的?
在我的 macbook 上解压 test.zip 后,我得到了 test.zip.cpgz,它再次给了我 test.zip 文件等等..
如我所说,在 Windows 上 .zip 文件已损坏,甚至无法打开。
我还认为,自动删除 .html 扩展名将是最好的选择,但如何呢? 希望它不像看起来那么难:)谢谢
【问题讨论】:
-
您可能会发现这里的答案很有帮助。stackoverflow.com/a/68492465/3946706
标签: java spring rest zip zipoutputstream