web-dev-qa-db-ja.com

node.jsのZipアーカイブ

Zipアーカイブを作成し、node.jsで解凍します。ノードの実装が見つかりません。助けてください。

45
msikora

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);
28
MateodelNorte

最終的にはこのようにしました(Expressを使用しています)。特定のディレクトリ(SCRIPTS_PATH)上のすべてのファイルを含むZipを作成しています。

これは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();
                }
            });
        });
26
Eliseo Soto

node-Zip npmモジュールを試すことができます。

JSZipをノードに移植して、Zipファイルを圧縮/圧縮解除します。

9
daraosn

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();
});
6
Ragnar

解凍のみが必要な場合、 node-zipfilenode-archive よりも軽量に見えます。それは間違いなく小さな学習曲線を持っています。

1
Paul Beusterien

7-Zipの周りに自分のラッパーを配置するのが最も簡単であることがわかりましたが、ランタイム環境で使用できるZipまたはコマンドラインZipツールを簡単に使用できます。この特定のモジュールは、1つのことだけを行います。ディレクトリを圧縮します。

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に保存したと仮定して、このように使用します。 3番目のlogパラメーターはオプションです。カスタムロガーがある場合に使用します。または、不快なログステートメントを完全に削除します。

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

(async () => {
  await zipdir('/path/to/my/directory', '/path/to/file.Zip');
})();
1
Todd Price

ファイルの圧縮に「アーカイバ」を使用しました。以下は、使用方法を示すStackoverflowリンクの1つです。 アーカイバでファイルを圧縮するためのStackoverflowリンク

1
WaughWaugh

ライブラリを使用/学習したくない場合は、 ノードを使用して子プロセスを実行してZipコマンドラインツールを制御します

Emmermanが言及したようなライブラリを学ぶことをお勧めしますが

0
timoxley

adm-Zip

これは、メモリ内のZipアーカイブを読み取り、作成、変更するためのJavaScript専用のライブラリです。

見た目はいいですが、少しバグがあります。テキストファイルの解凍に問題がありました。

0
Elmer