multipart/form-dataでの文字化け対策

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");
    :
   
  }
}