ページの先頭行へ戻る
 Apcoordinatorユーザーズガイド

17.2.1 ファイルをアップロードする

Webcoordinatorはバイナリファイルの送受信の機能を持っています。ファイルのアップロード・ダウンロードのアプリケーションを簡単に作成できます。ファイルをアップロードするアプリケーションは以下のように作成します。アップロードしたファイルを受け取るBeanのプロパティを、com.fujitsu.uji.util.MimeSource型に定義します。

import com.fujitsu.uji.util.MimeSource;
import com.fujitsu.uji.DataBean;

public class UpBean extends DataBean {
    protected MimeSource file;

    public MimeSource getFile() {
        return file;
    }
    public void setFile(MimeSource file) {
        this.file = file;
    }
}

入出力ページは以下のように作成します。

<%@ taglib uri="uji-taglib" prefix="uji" %>
<uji:useBean id="body" cls="updown.UpBean" request="true" />
<FORM method="post" enctype="multipart/form-data">
    <INPUT name="uji.verbs" type="hidden" value="upload"> 
    <INPUT name="uji.id" type="hidden" value="head">ファイル名: 
    <INPUT type="file" name="file" > 
    <BR>
    <INPUT name="upload" type="submit" value="送信"> 
</FORM>

ビジネスクラスでは、Beanからストリームとファイルを取り出すことができます。サーバに格納する場合は、サーバ上の絶対パスを指定します。

import java.io.InputStream;
import com.fujitsu.uji.util.MimeSource;
.....
    public void upload(DispatchContext context, UpBean dataBean) {
        MimeSource source = dataBean.getFile();
        InputStream is = source.getInputStream();
        String fname = source.getFileName();
        ....
    }
.....

ファイルの取り出しが終了したら、MimeSource型のプロパティにnullを設定します。このようにしてMimeSourceへの参照を削除することにより、ガーベジコレクタがMimeSourceを破棄できるようになります。MimeSourceが破棄された時点でリソースが解放されます。

dataBean.setFile(null);

ファイル転送のパラメタはアプリケーションクラスで指定します。アプリケーションクラスの以下のメソッドをオーバライドすることで、転送サイズの上限、転送時に使用するメモリサイズ(超えると作業ファイルを使用)を指定することができます。デフォルトは、転送サイズの上限が16Mバイト、メモリサイズが1Mバイトです。

// ファイル転送の最大サイズです。単位はバイトです。0は無制限を表します。
  public long getMimeTransferSizeLimit() {
    // 転送サイズの上限を32Mバイトにします。
    return 32*1024*1024;
  }

// ファイル転送時に準備するメモリサイズです。単位はバイトです。
  public int getMimeTransferMemorySize() {
    // 転送時に準備するメモリサイズを1Mバイトにします。
    return 1024*1024;
  }

ファイルをアップロードする場合には、以下の定量制限があります。

これらの定量制限を超えた場合は、IOException例外が発生します。発生した例外はDispatchExceptionクラスでラップされ、セションクラスに実装したhandleExceptionメソッド、アプリケーションクラスに実装したhandleExceptionメソッドに通知されます。なお、handleExceptionメソッドを使用するには、Postprocessorインタフェースをセションクラスまたはアプリケーションクラスに実装する必要があります。 handleExceptionメソッドの使用方法については、“4.2 エラー処理”を参照してください。