ファイルのアップロード
DEXTUploadNJは、HTTPプロトコルベースのでRFC1867規約にサーバーに送信されるマルチパート(multipart/form-data)のデータを処理するサーバーコンポーネントです。
一般的に、HTML形式でファイルを転送するには、form要素のenctype属性を「multipart/form-data」に設定し、form要素内のtype属性が「file」であるinput要素を使用する。
<form action="..." method="post" enctype="multipart/form-data"> ... <input type="text" name="name" value="DEXTUploadNJ"/> ... <input type="file" name="file1"/> ... </form>
転送されたデータは、Webアプリケーションサーバ(WAS)が受信した後、HttpServletRequestオブジェクトに包ま伝達がされ、getInputStreamメソッドを使用すると、データにアクセスすることができる。
しかし、InputStreamで提供されるデータからのファイルと文字列の要素を分離して保存する作業は非常に複雑な作業であり、DEXTUploadNJはInputStreamからデータを分離して、ビジネスロジックを実装するのに便利なようにFileUploadクラスを提供する。
// devpia.dextuploadnj.support.common.FileUploadクラスは、アップロードされたファイルを処理するクラスです。
FileUpload dextnj = new FileUpload(request, environment);
// クライアントから送信されたデータからファイルデータ部分の両方を一時ファイルとして保存する。
// 一時保管場所は、Environment#setTempRepositoryメソッドに設定される。
dextnj.prepare();
// name名前で配信されたフォームの情報を持つFormItemオブジェクトを得る。
FormItem formItem = dextnj.getFormItem("name");
// file1名前の一時ファイルの情報を持つFileItemオブジェクトを得る。
FileItem fileItem = dextnj.getFileItem("file1");
// 基本的に設定されたディレクトリのパスにファイルを保存する(一時ファイルを目的地に移動する行為と一致)する。
fileItem.save();
FileUploadオブジェクトは、HttpServletRequestオブジェクトを受け取り、生成し、prepareメソッドを使用して内部的にファイルや他のフォーム要素を分離する。 prepareメソッドの呼び出しが完了した後、getFormItemあるいはgetFileItemメソッドを使用して、文字列とファイルの要素を扱うことができるようになる。
- 一時ディレクトリとデフォルトのディレクトリ
-
DEXTUploadNJは、アップロードされたファイルの情報をメモリ上に記録するのではなく、一時ディレクトリに記録する。このプロセスは、prepareメソッドが実行時に実行され、実際の保存がされるべき場所にファイルを記録し(移動またはコピー)することは、FileItemインターフェースのsave、saveAsメソッドを呼び出して処理する。
ファイルを記録するディレクトリの情報を変更したい場合はEnvironmentオブジェクトのディレクトリ情報を登録して、このオブジェクトをFileUploadオブジェクトの作成時に一緒に渡すと、されている。
Environment env = new Environment(); // 一時ファイルが保存される位置 env.setTempRepository("/home/user/temp"); // ファイルが最終的に保存されるべき位置 env.setDefaultRepository("/home/user/files"); ... // 第2引数を使用して、オプションの値を提供しています。 FileUpload dextnj = new FileUpload(request, env); // またはsetEnvironmentメソッドを使用して設定することができる。 FileUpload dextnj = new FileUpload(request); dextnj.setEnvironment(env); - ファイルの保存場所と名前を変更する
-
FileItem インターフェースのsave、saveAsメソッドを使用すれば、ファイルは、デフォルトで設定された位置に記録される。 もし他のパスにファイルを記録するsave、saveAsメソッドのtargetDirectoryPathパラメータとtargetFilenameパラメータを使用して位置を変更したり、ファイル名を変更することができる。
// ファイルが最終的に保存する場所が「/ home / user / files」でファイル名が「photo.jpg」であるとき、 // 「/home/user/files/photo.jpg」パスに記録する。 fileItem.save(); // 「/home/user/other/files/photo.jpg」パスに記録する。 fileItem.save("/home/user/other/files"); // 「/home/user/files/photo_new.jpg」パスに記録する。 fileItem.saveAs("photo_new.jpg"); // 「/home/user/other/files/photo_new.jpg」パスに記録する。 fileItem.saveAs("/home/user/other/files", "photo_new.jpg");もし記録する場所に同じ名前のファイルが存在する場合、ファイル名の後ろに(数字)が付く。
- クライアントファイルの要素を取得
-
DEXTUploadNJは、クライアントに定義されたファイルのフォーム要素を取得するために、様々なメソッドをサポートする。
<form action="..." method="post" enctype="multipart/form-data"> ... <!-- 個別の名前が与えられた場合 --> <input type="file" name="file1"/> <input type="file" name="file2"/> <input type="file" name="file3"/> ... <!-- 同じ名前が与えられた場合 --> <input type="file" name="files"/> <input type="file" name="files"/> <input type="file" name="files"/> </form>
FileUpload dextnj = new FileUpload(request, environment); dextnj.prepare(); // 最初のファイルの要素を得る。 FileItem item = dextnj.getFileItem(0); // file1の名前を持つ対象を得る。 FileItem item = dextnj.getFileItem("file1"); // file2の名前を持つ対象を得る。 FileItem item = dextnj.getFileItem("file2"); // file3の名前を持つ対象を得る。 FileItem item = dextnj.getFileItem("file3"); // files名前を持つ最初の要素を得る。 FileItem item = dextnj.getFileItem("files"); // filesの名前を持つすべてのターゲット(files、files、files)を得る。 List<FileItem> items = dextnj.getFileItems("files"); // すべてのファイルの要素(file1、file2、file3、files、files、files)を得る。 List<FileItem> items = dextnj.getFileItems();