为了账号安全,请及时绑定邮箱和手机立即绑定

创建 zip 文件而不写入磁盘

创建 zip 文件而不写入磁盘

不负相思意 2023-04-13 15:00:59
我正在开发一个 Springboot 应用程序,当用户下载一些报告时,它必须将一个 zip 文件返回到前端。我想创建一个 zip 文件而不将 zip 文件或原始文件写入磁盘。我要压缩的目录包含其他目录,其中包含实际文件。例如dir1里面有subDir1和subDir2,subDir1会有两个文件subDir1File1.pdf和subDir1File2.pdf。subDir2 里面也会有文件。我可以通过在磁盘上创建物理文件轻松地做到这一点。但是,我觉得返回这些文件而不写入磁盘会更优雅。
查看完整描述

3 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

如果范围是写入内存,您将使用ByteArrayOutputStream 。本质上,zip 文件将完全包含在内存中,因此请确保您不会冒一次有太多请求的风险,并且文件大小是合理的!否则这种方法会严重适得其反!



查看完整回答
反对 回复 2023-04-13
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

您可以使用以下代码段:


public static byte[] zip(final String str) throws IOException {


        if (StringUtils.isEmpty(str)) {

            throw new IllegalArgumentException("Cannot zip null or empty string");

        }


        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        try (GZIPOutputStream gos = new GZIPOutputStream(bos)) {

            gos.write(str.getBytes(StandardCharsets.UTF_8));

        }

        return bos.toByteArray();


    }

但是正如另一个答案中所述,请确保您不会通过将所有内容加载到您的 Java 内存中来冒太大的风险。


查看完整回答
反对 回复 2023-04-13
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

这种方法的唯一缺点是:客户端将无法显示下载状态栏,因为服务器将无法发送“Content-length”标头。这是因为 ZIP 文件的大小只有在生成后才能知道,而服务器需要先发送文件头。所以 - 没有临时 zip 文件 - 事先没有文件大小。

您还在谈论子目录。这只是处理 ZIP 流时的命名问题。每个 zip 项目都需要这样命名:“directory/directory2/file.txt”。这将在解压缩时产生子目录。


查看完整回答
反对 回复 2023-04-13
  • 3 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信