stream+pipeを利用したmd5の算出

1 min read読了の目安(約1100字

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

うまくいきました🤗

参考

https://nodejs.org/api/crypto.html#crypto_class_hash

https://qiita.com/masakura/items/5683e8e3e655bfda6756