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;
}
}入出力ページは以下のように作成します。
formタグにenctype="multipart/form-data"を追加します。
ファイル名入力の入力フィールドをtype="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;
}ファイルをアップロードする場合には、以下の定量制限があります。
アップロードヘッダ長は1024バイト以内です。
アップロードヘッダには、項目名とファイル名の情報が含まれます。利用するブラウザによって多少異なりますが、項目名長とファイル名長を合わせて、970バイト程度を指定可能です。
アップロードファイルサイズの上限はデフォルトで16MB(16*1024*1024バイト)です。このサイズは、前述のとおり、アプリケーションクラスでgetMimeTransferSizeLimitメソッドをオーバライドすることで変更できます。
これらの定量制限を超えた場合は、IOException例外が発生します。発生した例外はDispatchExceptionクラスでラップされ、セションクラスに実装したhandleExceptionメソッド、アプリケーションクラスに実装したhandleExceptionメソッドに通知されます。なお、handleExceptionメソッドを使用するには、Postprocessorインタフェースをセションクラスまたはアプリケーションクラスに実装する必要があります。 handleExceptionメソッドの使用方法については、“4.2 エラー処理”を参照してください。