JSFの現在のバージョン1.2ではファイルのアップロード処理は標準では提供されていないっぽい。で、ネットで検索したらいくつか対策は見つかるけど、ちょっと自分には合わない…残念。…ので、我流の方法を試して見る事に。
ネットで見つかったのはこんなの
- Apach MyFacesを使えばファイルアップロード用のタグがあるらしいのでそれを使う。
- ファイルのアップロード部分だけServlet+JSP方式で処理する。
問題と思うのは…。最初の方法の場合、MyFacesはファイルアップロードのためだけのライブラリではないので、ファイルのアップロードのためだけに巨大なライブラリを入れたくない場合に不向き。次の方法の場合、必要なライブラリはApach FileUpload等だけで済むけど、同じページのファイルアップロード以外の部分をServletでガリガリ処理する事になる。
我流の方法ってのはこんなの
- Servlet Filterでリクエストを捕まえる。
- リクエストを解析し(HTTP&POST&multipart/form-data)以外は普段通りの処理をする。
- 目的のリクエストの場合はJSF用のServletが処理出来るよう、HttpServletRequestWrapperで 解析したリクエストをapplication/x-www-form-urlencoded形式に変換。ファイル形式のパラメタは リクエストスコープの属性として格納。その後は普段どおりに処理。
こうすればJSF用のServletがmultipart/form-data形式に対応出来るし、必要なライブラリもApache FileUploadだけで済む。別の方法で、自前でリクエストの解析からJSFのライフサイクル実行まで行うってのも考えられるけど…リクエストをラップするこの方法の方がコードは断然短いはず。
ちなみに…有名なサンプルプログラム PetStore ではファイルのアップロードはAJAXを使ってるっぽい。たぶんAJAXによるファイルのアップロードリクエストをShale RemotingがApache FileUploadで解析する部品に流してる雰囲気。でどうも詳しく見ていくとAJAX経由での処理の流れしか想定してないみたい。てかそもそもPetStoreはJavaScriptをOFFにするとページが表示されなくなったりする。
というかJSF、ファイルアップロード位は標準で備えてて欲しいような…。
けど、ま、いっか!いい方法思いついたし。今さら標準なんて…!!
…うけけ!おいらは自分が良ければそれでいいって性格なのさ!!


