JavaScriptでbase64エンコードしたファイルを、フォームからPOST送信する際にハマったところがあったのでメモ。
JavaScriptのFileReaderを使うことで、以下のようにファイルをbase64エンコードした文字列を取得することができる。
var reader = new FileReader;
reader.readAsDataURL(file);
reader.onload = function() {
var val = reader.result;
}
この時、valには以下のような形式の値が入る。
data:image/jpeg;base64,/9j/4AAQSkZJR……
ちなみにこの値をそのままPHPファイルなどでデコードしようとすると、うまくファイルを展開できない。
なぜbase64文字列をデコードできないのか?
実は先ほどの値は純粋なbase64文字列ではなく、余計な情報が先頭に入っていたのだ。
その余計な情報というのがこちらの箇所。
data:image/jpeg;base64,
値をPOST送信する前にこちらの情報を削除し、純粋なbase64文字列に変換してから送信しなければならないのだ。
DataURIをbase64文字列に変換する
先ほどの「余計な情報」を含んだものはDataURIと呼ばれるもので、JavaScriptでbase64文字列へ変換するコードを紹介する。
var reader = new FileReader;
reader.readAsDataURL(file);
reader.onload = function() {
var val = reader.result.replace(/data:.*\/.*;base64,/, '');
}
replaceメソッドを使用して、対象の箇所を空文字に変換している。
これでデータの受け取り側で正常にデコードすることができるようになる。