Javascriptでのバイナリファイルの取り扱い方(バイナリファイルのmd5ハッシュ(16進)を作りたい)
お世話になります。
monacaを使って、HTML5+Javascriptベースのevernoteアプリを開発しています。
しかし、画像をevernoteに投稿するための昨日の実装ができず、詰まっている状況です。
ウェブでまる1日情報を探しましたが、恥ずかしながらいまだ解決できていません。
背景は下記になります。
【1.使用する画像データ】
monacaのカメラプラグインの使用で、スマートフォンのカメラで撮影した画像ファイルをbase64形式 または ファイル URI 形式(例:file://xxxxx.jpg)で取得できます。
【2.Evernoteの仕様】
evernoteの仕様で、画像をアップロードするには、resourceを指定する必要があります。
更にresorce.data.bodyとしてバイナリデータを、resorce.data.bodyHashとしてMD5ハッシュ(16進)を指定する必要があります。
【3.現状(問題)】
・ハッシュが生成されない
・そもそも、変数へのバイナリファイルの入れ方に自信がない。
【4.試したこと】
1.http://hakuhin.jp/js/base64.html の「「Base64 文字列」から「ArrayBuffer」にデコード」にあるBase64_To_ArrayBuffer関数
及び
http://www.onicos.com/staff/iz/amuse/javascript/expert/ にある「md5.js」
を使用。(世に出す前には適切な権利関係の処理をいけませんが、ひとまず動作するかを見ています。)
2.実施したスクリプト(抜粋)
//変数定義
var photo_base64 ="";//ここには、外部の別の関数からbase64形式のデータが入力されます。
var binary_camera = new ArrayBuffer(10485760); //バイナリデータを入れる変数(のつもりですが、自信がありません。)
var hash = "";//撮った写真のハッシュ。evernoteにアップする際に必要。
var little_endian = false;// ビッグエンディアン方式を使用する。バイナリの中身をdata_viewを使って見る際の処理用の変数。
var pos = 0; // バッファの位置。バイナリの中身をdata_viewを使って見る際の処理用の変数。
//処理
binary_camera = Base64_To_ArrayBuffer(photo_base64);//base64をバイナリに変換している(つもり)
hash = MD5_hexhash(binary_camera);//MD5ハッシュを作っている(つもり)
var data_view = new DataView(binary_camera);//バイナリファイルの中を除くためのDataviewを作成
// 4 Byte ずつ読み込み(バイナリファイルの中身が埋まっているか確認)
console.log( data_view.getUint32(pos,little_endian) );
pos += 4;
console.log( data_view.getUint32(pos,little_endian) );
pos += 4;
3.結果
hashの出力結果が"0123456789abcdeffedcba9876543210"となり、MD5_hexhash()にうまく情報が渡せていないようです。
しかし、data_viewで確認すると、何らかのデータがきちんと埋まっているようです。
4.やりたいこと
変数へのバイナリデータの格納、ハッシュ文字列の生成。
今回はbase64形式でトライしましたが、ファイル URI 形式(例:file://xxxxx.jpg)でも構わないと考えています。
ただ、後者の場合、fileapiのfilereaderを使うことになるかと思いますが、これを使う場合は権限関係でユーザーがウェブ上でクリックしないといけないと聞いたことがあり、混乱しています。
雑駁ですが、解決策等、お気づきの点があれば、ご教示いただけないでしょうか。
ご多忙のところ、申し訳ございません。