【问题标题】:how to convert multiple files to compressed zip file using node js如何使用node js将多个文件转换为压缩的zip文件
【发布时间】:2013-08-11 02:47:46
【问题描述】:

我想将多个文件转换为 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);

【问题讨论】:

  • 我没有得到上面的代码,所以请告诉我一些易于理解的示例
  • 看看at this example。它对我有用。
  • 这段代码会允许多个文件并压缩它们吗?
  • 它将多个文件压缩成一个.zip,是的。
  • 嗨,mutil 对上面链接中的示例有疑问,我无法理解 var output = fs.createWriteStream(__dirname + '/example-output.zip'); 中的 example-output.zip 是什么如果可能的话,请解释一下

标签: node.js zip


【解决方案1】:

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'});

//
archive.finalize();

它还支持tar 存档,只需在第 4 行将 'zip' 替换为 'tar' 即可。

我没有得到这段代码的功劳,它只是README 的一部分(您应该查看它以了解其他将内容添加到存档中的方法)。

整洁的包,它可能是唯一仍在维护和正确记录的包。

【讨论】:

  • 我也是这样做的,但它会抛出一个错误,比如在archive.file关闭队列...我不知道为什么会发生,所以请告诉答案
  • 使用您的代码 + 错误堆栈打开一个新问题。你可以在这里分享链接,我去看看
  • 你确定我已经提出了这个问题..这里的链接是stackoverflow.com/questions/55001614/…
  • Leonardo 在您的帖子中提供的答案是正确的,这是一个简单的异步问题。
  • 我对归档器 readme 感到困惑,其中 1) 将 archive.pipe(output) before 附加文件和 archive.finalize()(不应该是 之后 i>?), 2) 调用archive.finalize() 就好像多个archive.file() 操作是同步的,它只会等待它们完成,3) 在可写output 流上有endclose 处理程序。问题:archive.file() 操作实际上是同步的吗? archive.finalize() 是否触发 archive.pipe(output)archive 如何知道何时不再添加文件?
【解决方案2】:

要压缩多个文件,您可以使用我在归档器模块中编写的这个实用方法:-

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】:

    使用节点js压缩文本文件

    var fs=require('fs');
    var Zlib=require('zlib');
    fs.createReadStream('input.txt').pipe(Zlib.createGzip()).pipe(fs.createWriteStream('input.txt.gz'));
    

    【讨论】:

    • 这只会压缩一个文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多