1. ホーム
  2. image

[解決済み】Base64でエンコードされた画像をディスクに保存するには?

2022-04-09 23:45:03

質問

私の Express アプリは、ブラウザから base64 エンコードされた PNG を受け取り(toDataURL()で canvas から生成)、それをファイルに書き込んでいます。しかし、このファイルは有効な画像ファイルではなく、"file" ユーティリティはこれを単に "data" として識別しています。

var body = req.rawBody,
  base64Data = body.replace(/^data:image\/png;base64,/,""),
  binaryData = new Buffer(base64Data, 'base64').toString('binary');

require("fs").writeFile("out.png", binaryData, "binary", function(err) {
  console.log(err); // writes out file without error, but it's not a valid image
});

解決方法は?

必要以上にデータを変換しているのではないでしょうか?適切なエンコーディングでバッファを作成したら、あとはそのバッファをファイルに書き込むだけです。

var base64Data = req.rawBody.replace(/^data:image\/png;base64,/, "");

require("fs").writeFile("out.png", base64Data, 'base64', function(err) {
  console.log(err);
});

new Buffer(..., 'base64') は、入力をbase64エンコードされた文字列として解釈し、単なるバイトの配列であるBufferに変換します。そして、そのバイト配列をファイルに書き込めばいいのです。

更新情報

コメントにもあるように req.rawBody はもうない。を使用している場合 express / connect を使用する必要があります。 bodyParser() ミドルウェアと使用 req.body また、標準的なNodeを使用してこれを行う場合、入力される data イベント Buffer オブジェクトを作成し、この画像データのパース処理を end のコールバックになります。