はじめに
NodeJsで外部サーバーからダウンロードした画像ファイルをローカルに保存する時の注意点をまとめる。
サンプルソース(修正前)
「NodeJsで外部サーバーからダウンロードした画像ファイルをローカルに保存する」と聞いてサクッと作ったサンプルが以下。
サンプルソース(修正前)
var options = {
uri: "http://local_nginx_server_ip/globalipcam_resize_snap"
};
request.get(options, function(error, response, body) {
if (!error) {
fs.writeFile("/saved_images/snap.jpg", body, function(errorWrite) {
});
}
});
※今時そんなコード???って驚かないで。色々理由があるのだ。
この時保存したsnap.jpgが画像ビューアでうまく表示されない。
バイナリエディア(BZ)で表示してみると、、、
"JFIF"などのキーワードは確認できるが、先頭が"FFD8"になっていない。
サンプルソース(修正後)
サンプルソース(修正後&抜粋)
var options = {
uri: "http://local_nginx_server_ip/globalipcam_resize_snap",
encoding: null
};
encodingを省略(上記"encoding: null"の行そのものを省略)したら"UTF-8"が指定されたことになるようなので、バイナリエディタで見た時の先頭が"FFD8"になっていなかったのはUTF-8 BOMの影響と思われる。
"encoding: null"はエンコードしない的な意味合いと思われる。
UTF-8 BOMは"EFBBBF"のようだ。でもバイナリエディタで"EFBFBDEF..."になる理由は現時点では不明。
修正後のソースを利用して保存したsnap.jpgは、、、
先頭が"FFD8"になっており、画像ビューアでもうまく表示された。