Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

nodejsでzip圧縮してみる

先日、nodejsでzipやtar圧縮ファイルをサーバーからフロントへダウンロードしてみました。
elsammit-beginnerblg.hatenablog.com

今回はサーバーサイドにてzipファイルを圧縮してみます。
自分で圧縮したzipファイルをダウンロードするまでのコードを作成してみます。



■環境

今回も前回と同様にラズパイをサーバーと見立て、PCから指示を出すようにします。
言語も前回と同様、nodejsです。
f:id:Elsammit:20211108231936p:plain

■サーバーサイドでzipファイルを圧縮する。

ではzip圧縮するコードを記載します。
コードは下記になります。

const fs = require('fs')
var http = require('http');
const archiver = require('archiver');

function zipFiles(){
    // 出力先のzipファイル名
    var zip_file_name = "src.zip";

    // ストリームを生成して、archiverと紐付ける
    var archive = archiver.create('zip', {});

    var output = fs.createWriteStream(zip_file_name);
    archive.pipe(output);

    archive.glob('img/*');
    
    // zip圧縮実行
    archive.finalize();
    output.on("close", function () {
        // zip圧縮完了すると発火する
        var archive_size = archive.pointer();
        console.log(`complete! total size : ${archive_size} bytes`);
    });
}

http.createServer(function(req,res){
    zipFiles();
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.write('Hello World\n');
    res.end();
}).listen(8080);

圧縮のコードはこちらになります。

function zipFiles(){
    // 出力先のzipファイル名
    var zip_file_name = "src.zip";

    // ストリームを生成して、archiverと紐付ける
    var archive = archiver.create('zip', {});

    var output = fs.createWriteStream(zip_file_name);
    archive.pipe(output);

    archive.glob('img/*');
    
    // zip圧縮実行
    archive.finalize();
}

圧縮を行うにあたりarchiverライブラリを用います。

var archive = archiver.create('zip', {});

でzip圧縮する旨を示し、

    var output = fs.createWriteStream(zip_file_name);
    archive.pipe(output);

    archive.glob('img/*');

にて圧縮ファイルに各データを入れておきます。
圧縮するデータはimgディレクトリ配下全てとしています。

こちらのコードを実行し、http requestするとHello Worldとresponseが返ってくるのと、
少し時間が経過するとsrc.zipという名の圧縮ファイルが格納されます。
本圧縮ファイルを解凍するとimg配下のデータが格納されているかと思います。

■zipファイル圧縮したデータをダウンロードしてみる

では先日作成したzipファイルをダウンロードするコードと組み合わせ、
zipファイル位圧縮したデータをダウンロードするコードを記載します。
コードはこちら。

const fs = require('fs')
var http = require('http');
const archiver = require('archiver');

function zipFiles() {
    return new Promise(function (resolve){
        // 出力先のzipファイル名
        var zip_file_name = "src.zip";

        // ストリームを生成して、archiverと紐付ける
        var archive = archiver.create('zip', {});

        var output = fs.createWriteStream(zip_file_name);
        archive.pipe(output);

        archive.glob('img/*');
        
        // zip圧縮実行
        archive.finalize();
        output.on("close", function () {
            resolve(0);
        });
    });
}

http.createServer(function(req,res){
    zipFiles().then(function(data){
        var fileName = "src.zip";
        var contentDip = 'attachment; filename=' + fileName;
        
        res.writeHead(200, {
            'Content-Type': 'application/zip',
            'Content-Disposition' : contentDip
        });
        var readStream = fs.createReadStream('src.zip');

        readStream.pipe(res);
    });
}).listen(8080);

下記割り込み関数や、

        output.on("close", function () {
            resolve(0);
        });

非同期関数(Promise)を用いていますが、
他は同じコードになります。

このコードを実行した後、

curl -o test.zip http://ipアドレス:8080/

というようにcurlコマンドでファイルをダウンロードすると、サーバーからデータがzip圧縮された状態で格納されるかと思います。

■最後に

今回はサーバーサイドにてzipファイルを圧縮するコードについてまとめてみました。
ファイルの取り扱いについてもう少し学んでいきたいので、もう少し調査進めてみます。