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 エラー処理”を参照してください。