我想创建.zip文件,其中包含我从后端收到的压缩文件,然后将此文件发送给用户。两天来我一直在寻找答案,找不到合适的解决方案,也许你可以帮我:)
现在,代码是这样的:(我知道我不应该在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扩展名?为什么要添加? 我不知道还能做什么。我也在尝试用类似以下内容替换ByteArrayOuputStream:
OutputStream outputStream = response.getOutputStream();
并将该方法设置为void,因此它什么也不返回,但是它创建的.zip文件被损坏了。
在解压缩test.zip后在我的Macbook上,我得到的是test.zip.cpgz,它又给了我test.zip文件,依此类推。
如我所说,在Windows上.zip文件已损坏,甚至无法打开。
我还认为,自动删除.html扩展名将是最好的选择,但是如何呢?希望它没有看起来那样困难
似乎已解决。我更换:
response.setContentType("application/zip");
与:
@RequestMapping(value = "/zip", produces="application/zip")
现在我得到了清晰,漂亮的.zip文件:)
如果你有更好或更快速的建议,或者只是想提出建议。