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();
});
このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です