先日、nodejsでzipやtar圧縮ファイルをサーバーからフロントへダウンロードしてみました。
elsammit-beginnerblg.hatenablog.com
今回はサーバーサイドにてzipファイルを圧縮してみます。
自分で圧縮したzipファイルをダウンロードするまでのコードを作成してみます。
■環境
今回も前回と同様にラズパイをサーバーと見立て、PCから指示を出すようにします。
言語も前回と同様、nodejsです。
■サーバーサイドで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ファイルを圧縮するコードについてまとめてみました。
ファイルの取り扱いについてもう少し学んでいきたいので、もう少し調査進めてみます。