90

任意のオペレーティング システムで Node.js のファイルをダウンロードして解凍.zipするための簡単なソリューションを探しているだけです。.tar.gz

これが組み込まれているのか、別のライブラリを使用する必要があるのか​​ わかりません。何か案は?ほんの数行のコードを探しているので、ノードでダウンロードしたい次の zip ファイルが来たら、簡単です。これは簡単かつ/または組み込まれているはずですが、何も見つかりません。ありがとう!

4

12 に答える 12

42

adm-zip をチェックアウトします。

ADM-ZIP は、NodeJS の zip データ圧縮のための純粋な JavaScript 実装です。

ライブラリを使用すると、次のことができます。

  • zip ファイルをディスクまたはメモリ内バッファに直接解凍する
  • .zipファイルを圧縮し、フォーマットまたは圧縮バッファでディスクに保存します
  • コンテンツの更新/新しいファイルの追加/既存のファイルの削除.zip
于 2012-04-25T01:26:40.740 に答える
36

ノードには、 zlibモジュールを介したgzipおよびdeflateのサポートが組み込まれています。

var zlib = require('zlib');

zlib.gunzip(gzipBuffer, function(err, result) {
    if(err) return console.error(err);

    console.log(result);
});

編集:たとえば(リクエストpipeを使用して)直接データを取得することもできます:Gunzip

var request = require('request'),
    zlib = require('zlib'),
    fs = require('fs'),
    out = fs.createWriteStream('out');

// Fetch http://example.com/foo.gz, gunzip it and store the results in 'out'
request('http://example.com/foo.gz').pipe(zlib.createGunzip()).pipe(out);

tarアーカイブには、npmで使用されるIsaacsのtarモジュールがあります。

編集2:フォーマットzlibをサポートしていないため、回答を更新しました。zipこれは。に対してのみ機能しgzipます。

于 2012-04-25T10:58:09.500 に答える
18

adm-zip や unzip などの nodejs unzip ライブラリをいくつか試した後、yauzl のラッパーである extract-zip に落ち着きました。実装が最も簡単なようです。

https://www.npmjs.com/package/extract-zip

var extract = require('extract-zip')
extract(zipfile, { dir: outputPath }, function (err) {
   // handle err
})
于 2016-07-04T06:00:49.337 に答える
15

yauzlは、解凍用の堅牢なライブラリです。設計原則:

  • 仕様に従ってください。ローカル ファイル ヘッダーをスキャンしません。ファイル メタデータの中央ディレクトリを読み取ります。
  • JavaScript スレッドをブロックしないでください。非同期 API を使用および提供します。
  • メモリ使用量を制御します。ファイル全体を一度に RAM にバッファしようとしないでください。
  • クラッシュしない (適切に使用した場合)。不正な形式の zip ファイルによって、エラーを検出しようとしているクライアント アプリケーションがダウンしないようにします。
  • 安全でないファイル名エントリをキャッチします。ファイル名が "/" または /[A-Za-z]:// で始まる場合、または ".." パス セグメントまたは "\" (仕様による) が含まれている場合、zip ファイル エントリはエラーをスローします。

現在、97% のテスト カバレッジがあります。

于 2015-03-02T18:27:23.360 に答える
5

私は以下で成功を収めました.zipで動作します
(投稿のためにここに簡略化されています:エラーチェックはなく、すべてのファイルを現在のフォルダーに解凍するだけです)

function DownloadAndUnzip(URL){
    var unzip = require('unzip');
    var http = require('http');
    var request = http.get(URL, function(response) {
        response.pipe(unzip.Extract({path:'./'}))
    });
}
于 2016-03-08T08:14:16.690 に答える
3

私はこれを長い間楽しみにしていましたが、簡単な実際の例は見つかりませんでしたが、これらの回答に基づいてdownloadAndUnzip()関数を作成しました.

使い方はとても簡単です:

downloadAndUnzip('http://your-domain.com/archive.zip', 'yourfile.xml')
    .then(function (data) {
        console.log(data); // unzipped content of yourfile.xml in root of archive.zip
    })
    .catch(function (err) {
        console.error(err);
    });

そして、ここに宣言があります:

var AdmZip = require('adm-zip');
var request = require('request');

var downloadAndUnzip = function (url, fileName) {

    /**
     * Download a file
     * 
     * @param url
     */
    var download = function (url) {
        return new Promise(function (resolve, reject) {
            request({
                url: url,
                method: 'GET',
                encoding: null
            }, function (err, response, body) {
                if (err) {
                    return reject(err);
                }
                resolve(body);
            });
        });
    };

    /**
     * Unzip a Buffer
     * 
     * @param buffer
     * @returns {Promise}
     */
    var unzip = function (buffer) {
        return new Promise(function (resolve, reject) {

            var resolved = false;

            var zip = new AdmZip(buffer);
            var zipEntries = zip.getEntries(); // an array of ZipEntry records

            zipEntries.forEach(function (zipEntry) {
                if (zipEntry.entryName == fileName) {
                    resolved = true;
                    resolve(zipEntry.getData().toString('utf8'));
                }
            });

            if (!resolved) {
                reject(new Error('No file found in archive: ' + fileName));
            }
        });
    };


    return download(url)
        .then(unzip);
};
于 2016-03-01T20:58:16.690 に答える
-1

別の実例:

var zlib = require('zlib');
var tar = require('tar');
var ftp = require('ftp');

var files = [];

var conn = new ftp();
conn.on('connect', function(e) 
{
    conn.auth(function(e) 
    {
        if (e)
        {
            throw e;
        }
        conn.get('/tz/tzdata-latest.tar.gz', function(e, stream) 
        {
            stream.on('success', function() 
            {
                conn.end();

                console.log("Processing files ...");

                for (var name in files)
                {
                    var file = files[name];

                    console.log("filename: " + name);
                    console.log(file);
                }
                console.log("OK")
            });
            stream.on('error', function(e) 
            {
                console.log('ERROR during get(): ' + e);
                conn.end();
            });

            console.log("Reading ...");

            stream
            .pipe(zlib.createGunzip())
            .pipe(tar.Parse())
            .on("entry", function (e) 
            {    
                var filename = e.props["path"];
                console.log("filename:" + filename);
                if( files[filename] == null )
                {
                    files[filename] = "";
                }
                e.on("data", function (c) 
                {
                    files[filename] += c.toString();
                })    
            });
        });
    });
})
.connect(21, "ftp.iana.org");
于 2012-12-20T15:29:12.257 に答える
-3

「unzip」を使用して、既存の zip ファイルを簡単に抽出することもできます。どんなサイズのファイルでも機能し、 npmからの依存関係として追加する必要があります。

fs.createReadStream(filePath).pipe(unzip.Extract({path:moveIntoFolder})).on('close', function(){
        //To do after unzip
				callback();
		});

于 2018-03-14T05:54:20.017 に答える