Node.jsでZip形式のファイル圧縮を行う方法
Node.jsにはzip圧縮を行うライブラリがあり、それらを使用することで簡単にファイルを圧縮することができます。
本記事では、Node.jsでライブラリarchiverを使ったZip圧縮の方法について解説します。
インストール
npm install archiver
ファイルに保存する方法
const archiver = require('archiver');
const fs = require('fs');
const path = require('path');
const output = fs.createWriteStream(path.join(__dirname, 'output.zip'));
const archive = archiver('zip', {
zlib: { level: 9 } // 圧縮レベル.
});
output.on('close', () => {
console.log('output file closed.');
});
output.on('end', () => {
console.log('Data has been drained.');
});
archive.on('warning', (err) => {
if (err.code === 'ENOENT') {
console.log('file no entry.');
} else {
console.error(err);
throw err;
}
});
archive.on('error', (err) => {
console.error(err);
throw err;
});
archive.pipe(output);
archive.append(fs.createReadStream(path.join(__dirname, 'sample.txt')), { name: 'input.txt' });
archive.finalize();
ファイルの追加方法
圧縮ファイルへファイルを追加するメソッドの使い方は以下の通りです。
文字列の内容をファイルで追加
archive.append('sample strings.', { name: <zipに格納するファイル名> });
name
を省略した場合はエラーとなります。
ファイルを追加
archive.append(fs.createReadStream(<読み込むファイル>), { name: <zipに格納するファイル名> });
name
を省略した場合はエラーとなります。
archive.file(<ファイル>, { name: <zipに格納するファイル名> });
name
を省略した場合はドライブ名を除いたフルパスで格納されます。
Bufferオブジェクトをファイルで追加
archive.append(<Buffer>, { name: <zipに格納するファイル名> });
name
を省略した場合はエラーとなります。
ディレクトリの追加
'new-subdir'に格納する。
archive.directory('subdir', 'new-subdir');
subdir内のファイルをZipファイルのルートに格納する。
archive.directory('subdir', false);
Expressのレスポンスで返す方法
archive.pipe()
のパラメータにレスポンスを指定します。
const archiver = require('archiver');
app.get('/dl-pdf', (request, response) => {
const archive = archiver('zip', {
zlib: { level: 9 } // 圧縮レベル.
});
archive.on('warning', (err) => {
if (err.code === 'ENOENT') {
console.log('file no entry.');
} else {
console.error(err);
response.sendStatus(500);
}
});
archive.on('error', (err) => {
console.log('on error');
console.error(err);
response.sendStatus(500);
});
archive.pipe(response);
archive.append('hello', { name: 'sample.txt' });
archive.finalize();
});