2007年8月1日水曜日

Teedaでファイルアップロード

スズキです。

Teedaでファイルアップロード機能を実現するための方法です。

ファイルアップロード機能を実現するには、現状、
MyFacesのTomahawkコンポーネントを利用する必要があります。
http://myfaces.apache.org/tomahawk/index.html

詳しくはこちらでまとめられています。
http://d.hatena.ne.jp/shot6/20061122

ここで注意するところが、Tomahawkのバージョンです。
現在、最新版は1.1.6ですが、これだと、ページ表示時に、
下記Exceptionが発生します。

org.seasar.framework.exception.IORuntimeException:
[ESSR0040]IO例外が発生しました。
理由はjava.io.NotSerializableException:
org.apache.myfaces.shared_tomahawk.config.MyfacesConfig
....

でバージョン下げながら試していくと、1.1.1で動作することが確認できました。
なので、最新バージョンではなく、1.1.1を使う必要があります。

ちなみに、依存するライブラリである、
commons-fileuploadとcommos-ioは最新版で動作確認できています。

ライブラリの準備ができたら、設定ファイルですが、これは、
web.xmlを下記のように追記します。

--------web.xml
<filter>
  <filter-name>tomahawkFilter</filter-name>
  <filter-class>
    org.apache.myfaces.component.html.util.ExtensionsFilter
  </filter-class>
  <init-param>
    <param-name>uploadMaxFileSize</param-name>
    <param-value>100m</param-value>
  </init-param>
  <init-param>
    <param-name>uploadThresholdSize</param-name>
    <param-value>100m</param-value>
  </init-param>
  <init-param>
    <param-name>uploadRepositoryPath</param-name>
    <param-value>/work</param-value>
  </init-param>
</filter>
--------

HTMLはこんな感じです。
Teedaのidのルール+Tomahawkの拡張タグって感じです。

--------uploader.html
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:x="http://myfaces.apache.org/tomahawk"
  xml:lang="ja" lang="ja">
  <body>
    <form id="hogeEntryForm" enctype="multipart/form-data">
      <x:inputFileUpload id="uploadedFile" value="#{uploadedFile}"/>
      <input id="doPersist" type="submit" value="登録・設定"/>
    </form>
  </body>
</html>
--------

Pageクラスはこんな感じです。
アップロードしたファイルはUploadedFileクラスのフィールドにDIされ、
操作できます。

--------UploaderPage.java
import org.apache.myfaces.custom.fileupload.UploadedFile;
public class UploaderPage {
  private UploadedFile uploadedFile;
  public String doPersist() {
    this.uploadedFile.getName();
    return null;
  }
  public UploadedFile getUploadedFile() {
    return uploadedFile;
  }
  public void setUploadedFile(UploadedFile uploadedFile) {
    this.uploadedFile = uploadedFile;
  }
}
--------

これで、ファイルアップロードだけでなく、Tomahawkも使えるようになったぞ。

--
blog: http://suz-lab.blogspot.com/

0 コメント: