どの言語でもバイナリ操作を苦としない、ユゲタです。
Nodejsでも、Bufferというグローバル関数が整っているので、画像ファイルや、何かしらのデータファイルなどの、テキストファイルではないデータの扱いはデフォルトで行えます。
まあ、大体の人が、何かしらのライブラリをnpmでrequireして、使っていると思いますが、単純にその場しのぎであれば、それでいいんですが、
仕事などで使ってしまうと、そのプラグインがdeprecated(非推奨)になったり、開発が終了して、サポート終了になったり、マイナーバージョンアップなどで、不具合を出してしまった時に困るのは、導入した担当者になるでしょう。
そして、先日このブログで公開したNodejsでファイルアップロードのバイナリファイル(画像ファイルなど)をPOST-requestで受け取るサーバー処理のソースコードを公開したんですが、少し足りていない処理があったので、今回はその部分修正版になります。
前回のブログ記事はこちら。
Nodejsでファイルアップロードしたファイルを受け取る簡単なソースを公開
前回の問題点
前回コードでしばらくデバッグがてら使っていたところ、日本語文字のファイル名をアップロードしたら、そのファイル名が文字化けしていたのを発見しました。
「動物.jpg」という画像ファイルをアップロードしたときに、「åç©.」 という風に、とても読めない文字になっているのを見つけて、バイナリ変換をした際にテキストも一緒にバイナリかしてしまっていることに気が付きました。
これを回避するためには、テキスト部分に関しては、バイナリ->テキストにデータ変換を行う必要がありました。
ようするに、ファイル名は全てテキストなので、filenameの箇所は全てテキストデータにする必要があったということでした。
Bufferの操作サンプル
という事で、これまでコピペで使っていたBuffer関数をちゃんと理解して、自在に変換できるようにしてみました。
とりあえず、テキストデータを一旦バイナリデータにして(エンコード)、それをまた、テキストデータに戻す(デコード)処理を簡単にプログラミングしてみました。
const str = "動物.jpg";
const buf = txt2bin(str);
const txt = bin2txt(buf);
console.log("base-text : "+ str);
console.log("txt2bin : "+buf);
console.log("bin2txt : "+ txt);
// テキストデータをバイナリデータに変換
function txt2bin(txt){
return Buffer.from(txt).toString("binary");
}
// バイナリデータをテキストデータに変換
function bin2txt(bin){
if(!bin){return ""}
return Buffer.from(bin , "binary").toString("utf-8");
}
これを実行すると、次の様になります。
$ node buf_test.js
base-text : 動物.jpg
txt2bin : åç©.jpg
bin2txt : 動物.jpg
バイナリデータは読めなくてもいいんですが、ちゃんとテキストにデコードできていることが確認できました。
簡単に解説をしておくと、
Buffer.from(変換するデータの入った変数 , "返還前の形式").toString("返還後の形式");
ポイントは、2つで、「返還前の形式"」と「返還後の形式」の箇所です。
テキスト->バイナリの場合は、返還前の形式 :未記入 -> 返還後の形式 : binaryとして、
バイナリ->テキストの場合は、返還前の形式 : binary -> 返還後の形式 : utf-8
BufferとtoStringの2つの関数で、形式の記述が違う点に注意しましょう。
作業を終えて
バイナリ操作ができるようになると、一気にプログラミングできる幅が広くなるし、無駄にライブラリを使うことが無くなるので、基礎をしっかりと覚えておくと非常にプログラミングライフが向上します。
取得したファイルのデータをバイナリに変換してさらにデータを16進数に変換することで、ファイルのフォーマットやヘッダ情報などを確認することができて、拡張子だけではないファイルタイプの確認ができるようになると、安定したツール作成などができるようになりますね。
これでやりたいことがまた無限大に膨らんでしまいました。
プログラミングたのし〜ね〜。
0 件のコメント:
コメントを投稿