我试图动态生成大型压缩文件(不需要压缩,只需存储文件),并通过restify进行流。压缩文件总共可以大于4 GiB,我使用的是ZIP64格式,在MacOS上似乎不支持这种格式。
我尝试使用node-archiver和yazl,它们都能够生成zip文件,但我无法通过MacOS中的本地图形实用程序打开它(例如,双击Finder中的文件)。最奇怪的是,本机unzip命令行实用程序在这里工作得很好,只是图形存档实用程序无法工作。
我还尝试使用简单的java实现创建zip,即使使用图形存档实用程序,生成的文件也能正常工作,所以问题可能在node-archiver/yazl库的实现中。我还尝试通过命令行(zip file.zip -0 ...files)创建zip,也可以通过ArchiveUtility打开它。
处理这种情况的正确方法是什么?是否还有其他节点库可以生成可以通过存档实用程序打开的ZIP64格式?
必须对zip文件进行流处理,而不是将其存储在磁盘上。我正在运行最新版本的MacOS塞拉利昂(10.12.5测试版)和节点6.9.1。
发布于 2017-05-21 17:38:34
如果有人像我一样努力满足相同的需求,请检查JSZip库(https://stuk.github.io/jszip/)。它还可以与节点流一起工作,并能够生成大于4 GiB的压缩文件,这些文件可以通过MacOS存档实用程序打开。唯一的限制是,您的文件不能大于4 GiB,因为32位CRC32哈希生成(但压缩文件可以更大)。
下面是如何使用这个库的一个片段:
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);https://stackoverflow.com/questions/43915104
复制相似问题