使用 12mb 文件大小的解压缩时出错

Error while using unzip with 12mb file size

我正在使用以下开源软件来解压缩文件,并且它按预期工作 zip 大小为 2-5 MB,但是当我将 zip 添加到 10 MB 以上时,出现错误, 有更稳定的开放源代码可用于大型 zip 文件吗? 我需要它在麻省理工学院的许可下。 这是我用过的 https://github.com/EvanOxfeld/node-unzip

var extractor = unzip.Extract({ path: "../"});

extractor.on("close", function() {
    console.log("Success unzip");
});

extractor.on("close", function(err) {
    console.log(err);
});

req.pipe(extractor);

按本期解压github页面-https://github.com/EvanOxfeld/node-unzip/issues/73,

  • 不再支持解压缩模块。
  • 一个与从 http 流式传输相关的问题似乎已在名为 unzip2 的分支(也很旧)中得到解决

试试

npm install unzip2

您还可以尝试其他 zip MIT 模块:

您还可以找到这个库 - https://www.npmjs.com/package/yauzl 它解释了为什么 'zip' 文件格式不太适合流式传输。

https://www.npmjs.com/package/yauzl#no-streaming-unzip-api

Due to the design of the .zip file format, it's impossible to interpret a .zip file from start to finish (such as from a readable stream) without sacrificing correctness. The Central Directory, which is the authority on the contents of the .zip file, is at the end of a .zip file, not the beginning. A streaming API would need to either buffer the entire .zip file to get to the Central Directory before interpreting anything (defeating the purpose of a streaming interface), or rely on the Local File Headers which are interspersed through the .zip file. However, the Local File Headers are explicitly denounced in the spec as being unreliable copies of the Central Directory, so trusting them would be a violation of the spec.

Any library that offers a streaming unzip API must make one of the above two compromises, which makes the library either dishonest or nonconformant (usually the latter). This library insists on correctness and adherence to the spec, and so does not offer a streaming API.

在 NPM 上 "unzip" 有 354 个结果 - https://www.npmjs.com/search?q=unzip

无论您选择什么库,请确保首先使用该库编写一个 node.js 程序,直接从文件系统中提取您出错的 zip 文件的内容。

一旦成功,您将能够增加 Web 服务器的额外复杂性。

我会使用 CloudConvert api 他们有一个 npm 可以处理这个问题。可以找到它的示例代码 in their documentation 节点特定示例是这个

var fs = require('fs'),
    cloudconvert = new (require('cloudconvert'))(''); // install using 'npm install cloudconvert'

fs.createReadStream('input.format').pipe(cloudconvert.convert({
"input": "upload"
}).on('error', function(err) {
    console.error('Failed: ' + err);
}).on('finished', function(data) {
    console.log('Done: ' + data.message);
    this.pipe(fs.createWriteStream('output.format'));
}).on('downloaded', function(destination) {
    console.log('Downloaded to: ' + destination.path);
}));

您确实需要互联网连接才能正常工作。至于 MIT 许可证,显然这是一个 api 不独立的代码。但它的功能和可靠性将超过本地系统上的任何东西。如果你担心麻省理工学院的许可证,它是免费的。如果您想要 MIT 许可证以便您可以编辑和操作它,这可能行不通。