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会議室