首页 > 解决方案 > 从 zip 存档中提取 gzip 文件

问题描述

我们正在创建一个 Web 服务,您可以在其中上传一个 zip 文件(有时 100MB 到 1GB 很大),然后通过 http 提供其内容。

内容通过静态 gzip 压缩提供。据我了解gzip本质上是一些标题+放气。Zip 也是一些元信息 + 多个可选压缩流,其中一些通常也是放气的。

我担心我们在那里做不必要的往返。解压缩 zip - 然后使用 gzip 压缩每个文件。从理论上讲,我们可以将 zip 切片为 deflate 块,添加一些标题,瞧,我们有 .gzip 压缩文件,而无需进行实际压缩,但这听起来像是其他人已经做过的事情。所以我的问题是:

是否有一些用于 Linux 的命令行工具或用于 Ruby/Node.js/C++ 的库,给定一个 .zip 文件将创建一个包含其内容的文件夹以及这些内容的 .gzip 压缩版本,而无需进行不必要的重新压缩?

标签: zipgzipdeflate

解决方案


使用我没有审查或测试过的免责声明,zip2gz是一个发布在 github 上的 Python 项目,用于从 ZIP 文件中提取压缩数据 blob 而无需解压缩。特别是,对于使用“deflate”压缩存储的文件,“它将获取原始的 deflate 数据并在其周围添加 gzip 页眉和页脚”。

将代码翻译成另一种语言应该很简单,除了可能import zipfile必须重新映射到zip目标语言的库/支持的依赖项(尽管实际使用的唯一部分是关于 ZIP 标头和中央目录,而不是任何 un/压缩)。

对于在 C 中进行反向转换(从 gzip 到单项 zip 文件)而不重新/压缩且没有任何外部库的 C 示例,请参阅 Mark Adler对Add .gz file to .zip archive without decompressing and re-compressing?的回答?.


推荐阅读