任意のオペレーティング システムで Node.js のファイルをダウンロードして解凍.zip
するための簡単なソリューションを探しているだけです。.tar.gz
これが組み込まれているのか、別のライブラリを使用する必要があるのか わかりません。何か案は?ほんの数行のコードを探しているので、ノードでダウンロードしたい次の zip ファイルが来たら、簡単です。これは簡単かつ/または組み込まれているはずですが、何も見つかりません。ありがとう!
adm-zip をチェックアウトします。
ADM-ZIP は、NodeJS の zip データ圧縮のための純粋な JavaScript 実装です。
ライブラリを使用すると、次のことができます。
- zip ファイルをディスクまたはメモリ内バッファに直接解凍する
.zip
ファイルを圧縮し、フォーマットまたは圧縮バッファでディスクに保存します- コンテンツの更新/新しいファイルの追加/既存のファイルの削除
.zip
ノードには、 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
ます。
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
})
yauzlは、解凍用の堅牢なライブラリです。設計原則:
現在、97% のテスト カバレッジがあります。
私は以下で成功を収めました.zipで動作します
(投稿のためにここに簡略化されています:エラーチェックはなく、すべてのファイルを現在のフォルダーに解凍するだけです)
function DownloadAndUnzip(URL){
var unzip = require('unzip');
var http = require('http');
var request = http.get(URL, function(response) {
response.pipe(unzip.Extract({path:'./'}))
});
}
私はこれを長い間楽しみにしていましたが、簡単な実際の例は見つかりませんでしたが、これらの回答に基づいて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);
};
別の実例:
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");
「unzip」を使用して、既存の zip ファイルを簡単に抽出することもできます。どんなサイズのファイルでも機能し、 npmからの依存関係として追加する必要があります。
fs.createReadStream(filePath).pipe(unzip.Extract({path:moveIntoFolder})).on('close', function(){
//To do after unzip
callback();
});