我正在尝试生成大型zip文件(无压缩,只是存储文件),并通过restify
流式传输。 zip文件总共大于4 GiB,我遇到了ZIP64格式的问题,似乎MacOS上没有正确支持。
我尝试使用node-archiver
和yazl
,他们都能够生成zip文件,但我无法通过MacOS中的原生图形工具打开它(例如只需双击在Finder文件中)。最奇怪的是,本地unzip
命令行实用程序在这里工作正常,只是图形存档实用程序无法正常工作。
我还尝试使用简单的java实现创建zip,即使使用图形Archive Utility,生成的文件也能正常工作,因此问题可能在于node-archiver
/ yazl
库的实现。我还试图通过命令行(zip file.zip -0 ...files
)创建zip,也可以通过Archive Utility打开它。
处理这种情况的正确方法是什么?是否有其他节点库可以生成可以通过Archive Utility打开的ZIP64格式?
有必要流式传输zip文件,而不是将其存储在磁盘上。我正在运行最新版本的MacOS sierra(10.12.5 beta)和节点6.9.1。
答案 0 :(得分:0)
如果有人遇到与我相同的要求,请检查JSZip
库(https://stuk.github.io/jszip/)。它还可以与节点流一起使用,并且能够生成大于4 GiB的zip文件,可以通过MacOS Archive Utility打开。唯一的限制是,由于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);