俺の雑記帳

My random memorandumです。(つまり、個人的な備忘録であり、その点ご容赦を。)

GAEjでバイナリファイルをデータストアにアップロード(&ライブラリ導入で躓いた)

Google App Engine for Java で、バイナリファイルをデータストア(ブロブストアでない)にアップロードするために調査したページ。
 データストアのBlob型やShortBlob型を使うサンプルコードを見つけるのに苦心した。
 また、Eclipseへのライブラリ(commons-fileupload)導入でいったんはあきらめるほど引っかかった。たいしたことではなかったのだが…躓きは恐ろしいな。

GAE-Jでアップロードした画像をデータストアに保存し、imgタグに出力する ― パソコンの前で分からないと叫ぶ
  データストアからのBlob型(ShortBlob型)の出力のコード。コピペ!(助かった!) でもアップロード部分が出来ず(Eclipseコンパイルは通っても、開発・本番環境ともにcommons-fileupload の依存性エラー(?)。commons-ioも入れたのに…) ⇒追記:このコードだと、multipartの関係で、通常フィールドの処理が難しい。→最下部参照。

Eclipseでライブラリ追加 ― かとうまさきさんの「ITアーキな日常」 (Javaって楽しい)
 もっとも丁寧な(楽しい?)説明をするサイトだが、Eclipseのバージョンが異なる為、この通りには行かず苦労した。(前段として
commons IOをコマンド実行環境に導入するページがある。ただ、Eclipseの環境とは分かれているので、作業的にはダウンロードしてくるぐらいしか関係ない。)

GAE-Jのデータストアにファイルをアップロードする - 放浪するエンジニアの覚え書き
 既述のエラーの参考になるかな? でもフレームワーク利用なのでちょっと違うかも。※●別件だが、GAEj上でframework(Struts)を使う件の参考にはなるかも。

commonsのFileUploadを使ったファイルのアップロードについて − Java Solution − @IT_php
 既述commons-fileuploadのエラー「NoClassDefFoundError」の参考になるかな?


↓↓ 一度、commons-fileuploadの導入は諦め、自分で書こうと思ったが、なかなかに大変そう。

Servlet APIにファイルアップロードが用意されたのはみんな知っていると思うが ― しんさんの出張所 はてな編
 『JavaEE 6、つまりServlet 3.0ではServletの定義にweb.xmlが必要なくなるとかソースで動的にフィルタやサーブレットを設定可能になったりかなり便利になったと思う。
ほかにも大きいものとしてやっと標準でマルチパートに対応した。つまり、サーブレットAPIで簡単にファイルアップロードが出来るのである。』
とのこと。
 ただ、GAEjはServlet3.0には対応していないようだ。
※★なお、GAEjは、JavaEE(J2EE)を導入しなくてもServletが使える。(なお、EclipseにJavaEEを導入はしていない。普通にJavaEEをインストールしただけじゃダメみたい。⇒ライブラリの導入だけでいいのか?Tomcat設定するとか書いてある資料が多いが、古いのか?)

さらにcommons-fileuploadを使わない方法を調べようとしたら、以下見つけた。
GAE/J でファイルをアップロードする方法を学ぶ - すぎゃーんメモ
 まず単純な例で、アップロードしてみるサンプルコード。この段階では、マルチパートの処理が出来てないが、commons-fileuploadを使わないのが参考になるはず!
Java 用 Google App Engine に関する質問 - Google App Engine - Google Code ― 「マルチパート フォーム データを処理するにはどうすればよいですか。または、アプリケーションへのファイルのアップロードを処理するにはどうすればよいですか。」 
 上記ブログ記事の最後に、このページを見つけて、下の記事でやり直したようだ。
Google App Engine でファイルをアップロードする方法 比較 すぎゃーんメモ

⇒結局、上記「すぎゃーんメモ」を詳しく参照する前に、躓きが解消した。

ついでに追加。
Google App Engine でのファイルアップロード 〜 ブロブキーの取得 - Google App Engine 入門 (keicode.com)
 ファイルアップロードを丁寧に解説している。ただし、ブロブストア利用。
(追記)→このclippの4/13の最後から2番目の記事で、これと同一のリンクも引用してBlobstoreの詳細を調べた。


⇒で、結局、Eclipse 3.7 Indigo へのライブラリ追加は以下の通り。
[1] Window > Preferences > Java > Build Path > User Libraries > Add JARs  (&? ...Build Path > Classpath Variables > New ??)
[2] プロジェクトを選択 > 右クリック > Build Path > Add Libraries
[3] プロジェクト > war > WEB-INF > lib ここへライブラリjarファイルコピー(ドラッグ&ドロップ)

----
追記:
最上部のURLのコードだと、通常フィールドが同時にPOSTされる場合は、処理が難しい。
以下commonsのドキュメントのようにFileItem.getString()を使いたいが、最上部のコードだと、FileItemStreamクラスなので、getString()が使用できず。ループの前からやり方を変えないと出来なさそう。(未検証)
FileUpload User guide (Processing the uploaded items) -- Apache Commons
 なお、日本語を取り扱うなら、
Commons Fileuploadのおかしなcharset対応 < Javaいろいろ < Program Island
のように、
String fieldValue = item.getString(request.getCharacterEncoding());
とかすべし。

----
さらに追記:
以下、2つ、実際には使えなかったけど、理解が深まった(?)。一応保存。
バイト列と数値を変換するには? < @IT .NET TIPS
よくみたらJavaじゃなかった。C#。
byte配列からの16進数出力 < 旧@IT会議室