Javascript 创建大于4 GiB的zip存档,可通过MacOS存档实用程序打开
我正在尝试动态生成大型zip文件(无需压缩,只需存储文件),并通过Javascript 创建大于4 GiB的zip存档,可通过MacOS存档实用程序打开,javascript,node.js,macos,zip,Javascript,Node.js,Macos,Zip,我正在尝试动态生成大型zip文件(无需压缩,只需存储文件),并通过restify对其进行流式处理。zip文件的总大小可能超过4 GiB,我使用ZIP64格式运行时遇到了问题,这在MacOS上似乎不受正确支持 我尝试使用和,它们都能够生成zip文件,但我无法通过MacOS中的本机图形工具打开它(例如,在Finder中双击文件)。最奇怪的是,本机的unzip命令行实用程序在这里工作得很好,只是图形存档实用程序不工作 我还尝试使用简单的java实现创建zip,即使使用图形存档实用程序,生成的文件也可以
restify
对其进行流式处理。zip文件的总大小可能超过4 GiB,我使用ZIP64格式运行时遇到了问题,这在MacOS上似乎不受正确支持
我尝试使用和,它们都能够生成zip文件,但我无法通过MacOS中的本机图形工具打开它(例如,在Finder中双击文件)。最奇怪的是,本机的unzip
命令行实用程序在这里工作得很好,只是图形存档实用程序不工作
我还尝试使用简单的java实现创建zip,即使使用图形存档实用程序,生成的文件也可以正常工作,因此问题可能出在节点archiver
/yazl
库的实现中。我还尝试通过命令行(zip file.zip-0…files
)创建zip文件,它也可以通过存档实用程序打开
处理这种情况的正确方法是什么?是否有其他节点库可以生成ZIP64格式,并可以通过Archive Utility打开
有必要对zip文件进行流式处理,而不是将其存储在磁盘上。我正在运行最新版本的MacOS sierra(10.12.5测试版)和node 6.9.1 如果有人遇到与我相同的需求,请检查
JSZip
library()。它还可以与节点流一起工作,并且能够生成大于4 GiB的zip文件,这些文件可以通过MacOS Archive Utility打开。唯一的限制是,由于32位CRC32哈希生成,您不能拥有大于4 GiB的文件(但zip文件可以更大)
以下是如何使用此库的一个片段:
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);