Node.jsを使用してディレクトリ全体を圧縮する必要があります。現在node-Zipを使用していますが、プロセスが実行されるたびに無効なZipファイルが生成されます( このGithubの問題 からわかるように)。
ディレクトリを圧縮できるNode.jsの別のオプションはありますか?
編集: archiver を使用してしまった
writeZip = function(dir,name) {
var Zip = new JSZip(),
code = Zip.folder(dir),
output = Zip.generate(),
filename = ['jsd-',name,'.Zip'].join('');
fs.writeFileSync(baseDir + filename, output);
console.log('creating ' + filename);
};
パラメーターのサンプル値:
dir = /tmp/jsd-<randomstring>/
name = <randomstring>
UPDATE:私が使用した実装について尋ねる人のために、 ここに私のダウンローダーへのリンクがあります :
私は archiver libを使用することになりました。よく働く。
var file_system = require('fs');
var archiver = require('archiver');
var output = file_system.createWriteStream('target.Zip');
var archive = archiver('Zip');
output.on('close', function () {
console.log(archive.pointer() + ' total bytes');
console.log('archiver has been finalized and the output file descriptor has closed.');
});
archive.on('error', function(err){
throw err;
});
archive.pipe(output);
archive.bulk([
{ expand: true, cwd: 'source', src: ['**'], dest: 'source'}
]);
archive.finalize();
私は何か新しいものを示すふりをするのではなく、コードでPromise関数を使用するのが好きな人(私のような人)のために上記の解決策を要約したいだけです。
const archiver = require('archiver');
/**
* @param {String} source
* @param {String} out
* @returns {Promise}
*/
function zipDirectory(source, out) {
const archive = archiver('Zip', { zlib: { level: 9 }});
const stream = fs.createWriteStream(out);
return new Promise((resolve, reject) => {
archive
.directory(source, false)
.on('error', err => reject(err))
.pipe(stream)
;
stream.on('close', () => resolve());
archive.finalize();
});
}
それが誰かを助けることを願っています;)
すべてのファイルとディレクトリを含めるには:
archive.bulk([
{
expand: true,
cwd: "temp/freewheel-bvi-120",
src: ["**/*"],
dot: true
}
]);
Node-glob( https://github.com/isaacs/node-glob )を使用するため、それと互換性のある一致する式はすべて機能します。
Archive.bulk
は非推奨になりました。これに使用される新しいメソッドは glob です。
var fileName = 'zipOutput.Zip'
var fileOutput = fs.createWriteStream(fileName);
fileOutput.on('close', function () {
console.log(archive.pointer() + ' total bytes');
console.log('archiver has been finalized and the output file descriptor has closed.');
});
archive.pipe(fileOutput);
archive.glob("../dist/**/*"); //some glob pattern here
archive.glob("../dist/.htaccess"); //another glob pattern
// add as many as you like
archive.on('error', function(err){
throw err;
});
archive.finalize();
これは、フォルダーを1行で圧縮する別のライブラリです。 Zip-local
var zipper = require('Zip-local');
zipper.sync.Zip("./hello/world/").compress().save("pack.Zip");
child_process
apiを使用します。サードパーティのライブラリは必要ありません。 2行のコード。
const child_process = require("child_process");
child_process.execSync(`Zip -r DESIRED_NAME_OF_Zip_FILE_HERE *`, {
cwd: PATH_TO_FOLDER_YOU_WANT_ZIPPED_HERE
});
同期APIを使用しています。非同期が必要な場合は、child_process.exec(path, options, callback)
を使用できます。リクエストをさらに微調整するために、単にCWDを指定するよりも多くのオプションがあります。 exec/execSync docsを参照してください。
注意:この例では、Zipユーティリティがシステムにインストールされていることを前提としています(少なくともOSXに付属しています)。一部のオペレーティングシステムにはユーティリティがインストールされていない場合があります(つまり、AWS Lambdaランタイムにはインストールされていません)。その場合、Zipユーティリティバイナリ here を簡単に取得し、アプリケーションソースコードと一緒にパッケージ化できます(AWS Lambdaの場合はLambdaレイヤーにパッケージ化することもできます)。サードパーティのモジュールを使用する(NPMにはたくさんあります)。 Zipユーティリティは数十年にわたって試行され、テストされているため、前者のアプローチを好みます。
Adm-Zipには、既存のアーカイブを圧縮するだけの問題 があり、https://github.com/cthackers/adm-Zip/issues/64 とバイナリファイルの圧縮。
Node-Zip https://github.com/daraosn/node-Zip/issues/4 で圧縮破損の問題に遭遇しました
node-archiverは圧縮に適しているように見えますが、解凍機能はありません。
結果を応答オブジェクトにパイプするには(ローカルに保存するのではなく、Zipをダウンロードする必要があるシナリオ)
archive.pipe(res);
ディレクトリのコンテンツにアクセスするためのサムのヒントは、私にとってはうまくいきました。
src: ["**/*"]
必要なものをカプセル化したこの小さなライブラリを見つけました。
npm install Zip-a-folder
const Zip-a-folder = require('Zip-a-folder');
await Zip-a-folder.Zip('/path/to/the/folder', '/path/to/archive.Zip');
簡単な方法で試すことができます:
Zip-dir
をインストールします。
npm install Zip-dir
そしてそれを使用する
var zipdir = require('Zip-dir');
let foldername = src_path.split('/').pop()
zipdir(<<src_path>>, { saveTo: 'demo.Zip' }, function (err, buffer) {
});