创建大于 4 GiB 的 zip 存档,该存档可以通过 MacOS 存档实用程序打开



我正在尝试即时生成大型zip文件(无需压缩,仅存储文件)并通过restify流式传输。zip文件总共可以大于4 GiB,我运行了ZIP64格式的问题,这似乎在MacOS上没有得到正确支持。

我尝试使用node-archiveryazl,它们都能够生成 zip 文件,但我无法通过 MacOS 中的本机图形实用程序打开它(例如,只需双击 Finder 中的文件)。最奇怪的是,本机unzip命令行实用程序在这里工作正常,只是图形存档实用程序不起作用。

我还尝试使用简单的 java 实现创建 zip,即使使用图形存档实用程序,生成的文件也可以正常工作,因此问题可能出在node-archiver/yazl库的实现中。我还尝试通过命令行(zip file.zip -0 ...files)创建zip,也可以通过存档实用程序打开它。

处理这种情况的正确方法是什么?是否有其他节点库可以生成可以通过存档实用程序打开的 ZIP64 格式?

有必要流式传输zip文件,而不是将其存储在磁盘上。我正在运行最新版本的MacOS sierra(10.12.5测试版)和节点6.9.1。

如果有人遇到与我相同的要求,请检查JSZip库 (https://stuk.github.io/jszip/)。它还可以处理节点流,并能够生成大于 4 GiB 的 zip 文件,这些文件可以通过 MacOS 存档实用程序打开。唯一的限制是,由于 32 位 CRC32 哈希生成(但 zip 文件可以更大),您不能拥有大于 4 GiB 的文件。

以下是如何使用此库的代码片段:

const fs = require('fs');
const JSZip = require('jszip');
const files = [...];
const zip = new JSZip();
for (const file of files) {
zip.file(file.name, fs.createReadStream(file.path));
}
res.header('Content-Type', 'application/zip');
res.header('Content-Disposition', `attachment; filename="${encodeURI(`test.zip`)}"`);
zip.generateNodeStream({streamFiles: true, compression: 'STORE'}).pipe(res);

相关内容

最新更新