我想创建一个包含后端传输的归档文件的ZIP文件,然后将此文件发送给用户。我已经寻找了2天答案,但未找到合适的解决方案,也许你可以帮助我:)
目前的代码如下(我知道我不应该全部放在Spring控制器中,但是这只是为了测试目的,不用担心它,只是为了找到解决方法):
@RequestMapping(value = "/zip")
public byte[] zipFiles(HttpServletResponse response) throws IOException {
// Setting HTTP headers
response.setContentType("application/zip");
response.setStatus(HttpServletResponse.SC_OK);
response.addHeader("Content-Disposition", "attachment; filename=\"test.zip\"");
// Creating byteArray stream, make it bufferable and passing this buffer 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
扩展名? - 为什么会添加它?
我不知道还能做什么。我也尝试用类似以下的东西替换 ByteArrayOuputStream
:
OutputStream outputStream = response.getOutputStream();
并将方法设置为void,以便它不返回任何内容,但它创建了一个已损坏的.zip
文件?
在我的MacBook上解压缩test.zip
后,我得到了test.zip.cpgz
,然后又得到了test.zip
文件,如此往复。
在Windows上,.zip文件已经损坏,甚至无法打开。
我还认为自动删除.html
扩展名可能是最好的选择,但如何实现呢?
希望这不像看起来那么难 :)
谢谢