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

今日もICEfacesでいくぞい。


今回はファイルアップロードをやってみる。

JSFではファイルアップロードコンポーネントが用意されていないが、ICEfacesは最初からある。

こいつを貼り付ける。



そしてアップロードの処理を記述するのだが、ポイントはこのコントロールのアクションメソッドで実行されるわけではないこと。あくまでもリスナーなのに注意だ。

リスナーのコードは以下のとおり。ActionEventから取得して処理をする。コンポーネントバインドしても取得できないので注意。あくまでもリスナーで。

private String text="";

public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

public void inputFile1_processAction(ActionEvent ae) {

    InputFile inputFile = (InputFile) ae.getSource();
    if (inputFile.getStatus() == InputFile.SAVED) {
        text = String.format("%s:%d\n%s",inputFile.getFileInfo().getFileName(),
                inputFile.getFileInfo().getSize(),
                text);

        System.out.println(inputFile.getFile().getAbsolutePath());
    }
}

テキストエリアを貼り付けて表示するためのtextプロパティを用意してある。ログのように見るため。



実行!

ファイル名やファイルのサイズがちゃんと取得できているようだ。




ところで、ファイルはgetFile()でFileが取得できるのだが、このアップロードされたテンポラリファイルはどこにあるのだろうか?

先ほどのリスナーメソッド以下の一文を付け加えてみる。

    System.out.println(inputFile.getFile().getAbsolutePath());

実行!

C:\Program Files\glassfish-v2ur2\domains\domain1\applications\j2ee-modules\ICEFacesTest\0a68ab31be6e23f4c7109ea59d6d\Java Printing.pdf

どうやらデプロイした場所にデフォルトでアップロードされるようだ。当たり前だが、このパスだと予測はしにくくても直接ファイルが外から見えてしまう。

それらしい設定はあるのだろうか?


たぶんこの「uploadDirectory」だ!

ここを設定してみる。「WEB-INF/temp」と入れてみた。

実行!

C:\Program Files\glassfish-v2ur2\domains\domain1\applications\j2ee-modules\ICEFacesTest\WEB-INF\temp\0b7a6d414f3d22b296812baebfa4\Java Printing.pdf

うん、問題ない。


さらに「uploadDirectoryAbsolute」を「true」似設定してみる。

実行!

C:\Program Files\glassfish-v2ur2\domains\domain1\config\WEB-INF\temp\0ba8ef88049eb030de4fbc16c8ee\Java Printing.pdf

ん〜予想と違う。

今度は「uploadDirectory」に「/WEB-INF/temp」と入れてみた。先頭にスラッシュをいれただけ。

実行!

C:\WEB-INF\temp\0bc0164f10f500b5f9ce8af3a6a0\Java Printing.pdf


うん。予想通り。ちなみに先頭にスラッシュをつけてる状態で相対パスにしてもちゃんと動く。



以上でICEfacesでは簡単にファイルアップロードが実装できるのがわかっただろうか。

ちなみにファイルアップロードのサイズ制限はweb.xmlのコンテキストパラメータに定義する。

「com.icesoft.faces.uploadMaxFileSize」というのがキーだ。