Google App Engineで画像をアップロードし、BigTableへ登録する処理についてです。
画像と一緒に文字列をアップロードする場合の処理は前回書きました。
しかし、取得した文字列が日本語などのマルチバイト文字の場合、文字化けが発生してしまいます。
その対処について書きます。
これらの問題を色々調べて解決したのですが、解決方法を忘れないように備忘録として残しておきます。
通常、リクエストパラメータの文字列をエンコーディングする場合、request.setCharacterEncoding(“UTF-8”)のように設定することで、エンコーディングできる。
しかしながら、これはrequest.getParameterでパラメータを取得する場合では有効だが、今回のようなマルチパートデータとして取り出す場合は通用しない。
実際にsetCharacterEncodingを使用した場合、”あああ”という文字を送信するとエンコーディングされずに”ããã”というように文字化けしてしまう。
そこで別の方法で文字化けを回避する必要があるのだ。
この文字化けは以下の方法で対処することができた。
取得した文字列を一度バイト配列に格納する。
byte[] bytes= filetitle.getBytes(“iso-8859-1”)
その後、Stringコンストラクタで”utf-8″に復号化する。
filetitle = new String(bytes, “utf-8”);
前回のソースコードの場合、以下のようなソースとなる。
view側
<div style="BACKGROUND-COLOR: #ffffcc"> <form method="POST" <font color="#FA8072">enctype="multipart/form-data"</font> action="/imageup"> <input type="text" name="filetitle" /> ←タイトル名などの文字列 <input type="file" size="30" name="imgfile" /> ←画像ファイル </form> </div>
サーバ側
//リクエストデータをFileItem型のリストに格納
List<FileItem> list = upload.parseRequest(req);
//アップロードデータを順に処理(ここはiteratorを使うべきなのかも。。。)
for(FileItem item : list){
//画像の場合、isFormFildがFalseとなるため、ここで画像なのか、通常のパラメータかを判別する。
if(!(item.isFormField())){
//画像をアップする処理
fileName = item.getName();
:
:
}else { //通常パラメータの場合、isFormFildがTrueとなる。
//ここで、タイトル名を取得する。getStringメソッドで簡単に取得できる。
filetitle = item.getString();
filetitle = new String(filetitle.getBytes("iso-8859-1"), "utf-8");
:
}
}