Google App Engineで画像をアップロードし、BigTableへ登録する処理を先日、作成し公開したが、ここで苦労したことが2つある。
内容は以下である。
1.画像ファイルと一緒にファイル名などの文字列を一緒にサーバへ送信しても、サーバ側で文字列が取得できない。
2.文字列を取得できるようになったが、日本語などのマルチバイト文字は文字化けしてしまう。
これらの問題を色々調べて解決したのだが、解決方法を忘れないように備忘録として残しておく。
また、同じようなことで困っている人の参考になれば幸いである。
1つ目の問題の現象は以下である。今回は1つ目の解決方法を記述する。
画像などのファイルをサーバへPOSTする際、ファイルサイズが大きすぎたりするので、従来のURLエンコーディングでは無理がある。
そこで、以下のように設定し、MIMEのマルチパートデータとして送信するようにする。
<form method="POST" enctype="multipart/form-data" action="/imageup"> <input type="text" name="filetitle" /> ←タイトル名などの文字列 <input type="file" size="30" name="imgfile" /> ←画像ファイル </form>
ここで、画像ファイルと一緒に送信するパラメータ”filetitle”のServlet側での取得方法が分からなかった。
URLエンコーディングで送られてくるわけではないため、従来のような
String title_name = request.getParameter(“filetitle”)
といった方法で取得することはできないのである。
この場合の取得方法は以下であった。
以下、ソースコードを抜粋
//リクエストデータを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();
:
}
}
で、これでは、取得した文字が文字化けしてしまうため、その対策を続きにまとめました。
続きはこちら
multipart/form-dataでの文字化け対策