👏
stream+pipeを利用したmd5の算出
httpで画像データを読み取ったデータを、クラウドストレージへ書き込むという処理をstreamを使って実現しています。
画像のmd5が必要になったのでstreamのpipeを利用してうまいことできないか調査しました。
解決作
hash用のデータだけ抜き取って、実データは未加工のまま下流へ流すようなTransformクラスを実装。
サンプルコード
ローカルファイルのstream読み込み、書き込みの例。
途中でmd5算出用Transformを噛ましている。
stream.js
const fs = require('fs');
const crypto = require('crypto');
const { Transform } = require('stream');
const src = fs.createReadStream('small.jpg');
const dest = fs.createWriteStream('small_dest.jpg');
//Streamデータを抜き取りmd5を計算する処理
const hash = crypto.createHash('md5');
const hashTransform = new Transform({
transform(
chunk,
encoding,
done
) {
hash.update(chunk); // hash用にデータだけ抜き取る
this.push(chunk) // データを下流のパイプに渡す処理
done() // 変形処理終了を伝えるために呼び出す
},
});
//メイン処理
src.pipe(hashTransform).pipe(dest).on('finish', () => {
const md5sum = hash.digest('hex');
console.log(md5sum);
});
実行結果
~/w/s/stream ❯❯❯ node ./stream.js
285903447e55e04bc21068a1f263768d
~/w/s/stream ❯❯❯ md5sum small.jpg
285903447e55e04bc21068a1f263768d small.jpg
うまくいきました🤗
参考
Discussion