在node.js中压缩zip存档

时间:2011-04-22 09:34:21

标签: node.js zip

我想创建一个zip存档并在node.js中解压缩它。我找不到任何节点实现。 请帮忙。

10 个答案:

答案 0 :(得分:28)

node-core内置了zip功能:http://nodejs.org/api/zlib.html

使用它们:

var zlib = require('zlib');
var gzip = zlib.createGzip();
var fs = require('fs');
var inp = fs.createReadStream('input.txt');
var out = fs.createWriteStream('input.txt.gz');

inp.pipe(gzip).pipe(out);

答案 1 :(得分:26)

我最终这样做(我正在使用Express)。我正在创建一个ZIP,其中包含给定目录中的所有文件(SCRIPTS_PATH)。

我只是在Mac OS X Lion上测试了这个,但我想它在安装了Cygwin的Linux和Windows上运行得很好。

    var spawn = require('child_process').spawn;
    app.get('/scripts/archive', function(req, res) {
            // Options -r recursive -j ignore directory info - redirect to stdout
            var zip = spawn('zip', ['-rj', '-', SCRIPTS_PATH]);

            res.contentType('zip');

            // Keep writing stdout to res
            zip.stdout.on('data', function (data) {
                res.write(data);
            });

            zip.stderr.on('data', function (data) {
                // Uncomment to see the files being added
                //console.log('zip stderr: ' + data);
            });

            // End the response on zip exit
            zip.on('exit', function (code) {
                if(code !== 0) {
                    res.statusCode = 500;
                    console.log('zip process exited with code ' + code);
                    res.end();
                } else {
                    res.end();
                }
            });
        });

答案 2 :(得分:9)

您可以尝试node-zip npm模块。

它将JSZip移植到节点,压缩/解压缩zip文件。

答案 3 :(得分:6)

你可以使用archiver模块,这对我很有帮助,这是一个例子:

var Archiver = require('archiver'),
    fs = require('fs');
app.get('download-zip-file', function(req, res){    
    var archive = Archiver('zip');
    archive.on('error', function(err) {
        res.status(500).send({error: err.message});
    });
    //on stream closed we can end the request
    res.on('close', function() {
        console.log('Archive wrote %d bytes', archive.pointer());
        return res.status(200).send('OK').end();
    });
    //set the archive name
    res.attachment('file-txt.zip');
    //this is the streaming magic
    archive.pipe(res);
    archive.append(fs.createReadStream('mydir/file.txt'), {name:'file.txt'});
    //you can add a directory using directory function
    //archive.directory(dirPath, false);
    archive.finalize();
});

答案 4 :(得分:1)

如果您只需要解压缩,node-zipfile看起来重量轻于node-archive。它肯定有一个较小的学习曲线。

答案 5 :(得分:1)

我使用了' archiver'用于压缩文件。这是Stackoverflow链接之一,它显示了如何使用它,Stackoverflow link for zipping files with archiver

答案 6 :(得分:0)

如果您不想使用/学习图书馆,可以use node to control the zip commandline tools by executing child processes

虽然我建议学习像Emmerman提到的那样的图书馆

答案 7 :(得分:0)

adm-zip

这是一个仅用于javascript的库,用于在内存中读取,创建和修改zip存档。

它看起来很不错,但它有点儿马车。解压缩文本文件时遇到了一些麻烦。

答案 8 :(得分:0)

我发现最容易在7-zip上滚动自己的包装器,但是您可以轻松地使用zip或运行时环境中可用的任何命令行zip工具。这个特定的模块只做一件事:压缩目录。

const { spawn } = require('child_process');
const path = require('path');

module.exports = (directory, zipfile, log) => {
  return new Promise((resolve, reject) => {
    if (!log) log = console;

    try {
      const zipArgs = ['a', zipfile, path.join(directory, '*')];
      log.info('zip args', zipArgs);
      const zipProcess = spawn('7z', zipArgs);
      zipProcess.stdout.on('data', message => {
        // received a message sent from the 7z process
        log.info(message.toString());
      });

      // end the input stream and allow the process to exit
      zipProcess.on('error', (err) => {
        log.error('err contains: ' + err);
        throw err;
      });

      zipProcess.on('close', (code) => {
        log.info('The 7z exit code was: ' + code);
        if (code != 0) throw '7zip exited with an error'; // throw and let the handler below log it
        else {
          log.info('7zip complete');
          return resolve();
        }
      });
    }
    catch(err) {
      return reject(err);
    }
  });
}

假设已将上述代码保存到zipdir.js中,请像这样使用它。第三个log参数是可选的。如果您有自定义记录器,请使用它。或完全删除我讨厌的日志语句。

const zipdir = require('./zipdir');

(async () => {
  await zipdir('/path/to/my/directory', '/path/to/file.zip');
})();

答案 9 :(得分:-4)

您可以使用支持node.js和.NET进程间互操作的edge.js模块,然后调用.NET框架的ZipFile类,它允许您操作ZIP存档。这是一个complete example of creating a ZIP package using edge.js。另请查看unzip example using edge.js