Google App Engineで画像アップロードと一緒に文字列パラメータを送信する。

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での文字化け対策