如何使用Node.js将多个文件转换为压缩Zip文件

12

我想在node.js上将多个文件转换为压缩的zip文件。

我尝试了以下代码:

var archiver = require('archiver');
var fs = require('fs');
var StringStream = require('string-stream');

http.createServer(function(request, response) {
    var dl = archiver('data');
    dl.pipe(response);
    dl.append(new fs.createReadStream('test/fixtures/test.txt'), {
        name: 'stream.txt', date: testDate2
    });
    dl.append(new StringStream("Ooh dynamic stuff!"), {
        name : 'YoDog/dynamic.txt'
    });
    dl.finalize(function(err) {
        if (err)
            res.send(200000)
    });
}).listen(3500);

我无法理解上述代码,请给我一些易于理解的示例。 - Kusuma Jammula
嗨,Mutil,我对上面链接中的示例有疑问,我不明白 var output = fs.createWriteStream(__dirname + '/example-output.zip'); 中的 example-output.zip 是什么,请尽可能地解释一下。 - Kusuma Jammula
应用程序崩溃,出现错误代码 ENOENT,等待文件更改后重新启动。 - Kusuma Jammula
“example-output.zip” 是压缩后得到的 zip 文件的名称。 “ENOENT” 错误意味着指定的文件(fixtures/file1.txt 和 fixtures/file2.txt)未找到。将“var file1”和“var file2”更改为要压缩的文件的路径。 - mutil
Mutil已经收到了压缩文件,谢谢。但仍有一些疑问。 - Kusuma Jammula
显示剩余4条评论
3个回答

26

使用 archiver 模块有一个更简单的解决方案:

var fs = require('fs');
var archiver = require('archiver');
var output = fs.createWriteStream('./example.zip');
var archive = archiver('zip', {
    gzip: true,
    zlib: { level: 9 } // Sets the compression level.
});

archive.on('error', function(err) {
  throw err;
});

// pipe archive data to the output file
archive.pipe(output);

// append files
archive.file('/path/to/file0.txt', {name: 'file0-or-change-this-whatever.txt'});
archive.file('/path/to/README.md', {name: 'foobar.md'});

// wait for streams to complete
archive.finalize();

该程序还支持tar归档文件,只需要在第4行将“zip”替换为“tar”即可。

我对这段代码没有任何功劳,它只是README的一部分(你应该查看其他将内容添加到归档中的方法)。

这是一个不错的软件包,并且可能是唯一一个仍然被正确维护和记录文档的软件。


我也是这样做的,但会出现一个错误,像是在archive.file处队列关闭了...我不知道为什么会发生这种情况,请告诉我答案。 - Prakash
用你的代码和错误栈打开一个新问题。你可以在这里分享链接,我会看一下。 - Overdrivr
当然,我已经提出了这个问题。这里是链接:https://dev59.com/Si8AtIcB2Jgan1zn7qmZ - Prakash
Leonardo 在你的帖子中提供的答案是正确的,这只是一个简单的异步问题。 - Overdrivr
1
我对 archiver readme 感到困惑,因为:1)它在添加文件和 archive.finalize() 之前放置了 archive.pipe(output)(难道不应该是在之后吗?),2)调用 archive.finalize() 就好像多个 archive.file() 操作是同步的,并且它只会等待它们完成,3)在可写的 output 流上有 endclose 处理程序。问题:archive.file() 操作实际上是同步的吗?archive.finalize() 是否触发 archive.pipe(output)archive 如何知道不再添加文件? - user1063287

4

如果您想压缩多个文件,您可以使用我编写的具有归档程序模块的此实用程序方法:

var zipLogs = function(working_directory) {
    var fs = require('fs');
    var path = require('path');
    var output = fs.createWriteStream(path.join(working_directory, 'logs.zip'));
    var archiver =  require('archiver');
    var zipArchive = archiver('zip');

    zipArchive.pipe(output);
    zipArchive.bulk([{src: [path.join(working_directory, '*.log')],  expand: true}]);
    zipArchive.finalize(function(err, bytes) {
        if (err)
            throw err;

    console.log('done:', base, bytes);
    });
}

这个例子会将特定目录中的所有日志文件压缩。

-3
使用Node.js压缩文本文件
var fs=require('fs');
var Zlib=require('zlib');
fs.createReadStream('input.txt').pipe(Zlib.createGzip()).pipe(fs.createWriteStream('input.txt.gz'));

1
这只压缩一个文件。 - Deepal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接