ファイルのアップロード(Servlet/JSP)
DEXTUploadJKは、HTTPプロトコルベースのRFC1867規約でサーバーに送信されるマルチパート/マルチデータを処理するサーバーコンポーネントです。
通常、HTMLからファイルを転送するには、form要素のenctype属性を 'multipart / form-data'に設定し、form要素内でtype属性が 'file'のinput要素を使用します。
<form action="..." method="post" enctype="multipart/form-data"> <input type="text" name="name" value="DEXTUploadJK"/> <input type="file" name="file1"/> </form>
送信されたデータは、Webアプリケーションサーバー(WAS)が受信した後、HttpServletRequestオブジェクトに包まれて転送され、getInputStreamメソッドを使用するとデータにアクセスできます。
ただし、InputStreamで提供されるデータからファイルと文字列要素を分離して保存するのは非常に複雑な作業であるため、DEXTUploadJKはInputStreamからデータを分離してビジネスロジックを実装するのに便利なFileUploadクラスを提供します。
// dextuploadjk.support.common.FileUpload クラスはアップロードされたファイルを処理するクラスです。
FileUpload fileUpload = new FileUpload(request, environment);
// クライアントから送信されたデータからファイルデータ部分をすべて一時ファイルとして保存します。
// 一時保存場所はEnvironment#setTempRepositoryメソッドで設定されます。
fileUpload.prepare();
// 名前で渡されたフォームに関する情報を持つFormItemオブジェクトを取得します。
FormItem formItem = fileUpload.getFormItem("name");
// 名前の一時ファイル情報を持つFileItemオブジェクトを取得します。
FileItem fileItem = fileUpload.getFileItem("file1");
// デフォルトに設定されたディレクトリパスにファイルを保存(一時ファイルを宛先に移動する行為と一致)する。
fileItem.save();
The FileUpload オブジェクトはHttpServletRequestオブジェクトを渡して生成され、prepareメソッドを使用して内部的にファイルと他のフォーム要素を分離します。 prepareメソッドの呼び出しが完了したら、getFormItemまたはgetFileItemメソッドを使用して文字列とファイル要素を扱うことができます。
- 一時ディレクトリと基本ディレクトリ
-
DEXTUploadJKは、アップロードされたファイル情報をメモリに記録するのではなく、一時ディレクトリに書き込みます。 このプロセスはprepareメソッドが実行されたときに実行され、実際の保存が必要な場所にファイルを書き込む(移動またはコピーする)作業は、FileItemインタフェースのsave、saveAsメソッドを呼び出して処理します。
ファイルを記録するディレクトリに関する情報を変更したい場合は、Environmentオブジェクトにディレクトリ情報を登録し、このオブジェクトをFileUploadオブジェクトの作成時に一緒に渡すだけです。
Environment env = new Environment(); // 一時ファイルが保存される場所 env.setTempRepository("/home/user/temp"); // ファイルを最終的に保存する場所 env.setDefaultRepository("/home/user/files"); ... // 2番目のパラメータを使用してオプション値を提供します。 FileUpload fileUpload = new FileUpload(request, env); // あるいは、setEnvironmentメソッドを使用して設定できます。 FileUpload fileUpload = 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’ パスに書き込む。 FileSaveOption option = new FileSaveOption(); option.setTargetDirectoryPath("/home/user/other/files"); fileItem.save(option); // ‘/home/user/files/photo_new.jpg’ パスに書き込む。 FileSaveOption option = new FileSaveOption(); option.setTargetFilename("photo_new.jpg"); fileItem.saveAs(option);記録する場所に同じ名前のファイルが存在する場合、ファイル名の後に(数字)が付く。
- クライアントファイル要素の取得
-
DEXTUploadJKは、クライアントで定義されたフォームのファイルフィールド要素を取得するためのさまざまなメソッドをサポートしています。
<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 fileUpload = new FileUpload(request, environment); fileUpload.prepare(); // 最初のファイル要素を取得します。 FileItem item = fileUpload.getFileItem(0); // file1 名前を持つターゲットを取得します。 FileItem item = fileUpload.getFileItem("file1"); // file2 名前を持つターゲットを取得します。 FileItem item = fileUpload.getFileItem("file2"); // file3 名前を持つターゲットを取得します。 FileItem item = fileUpload.getFileItem("file3"); // files 名前を持つ最初の要素を取得します。 FileItem item = fileUpload.getFileItem("files"); // ファイル名を持つすべてのターゲット(files, files, files)を取得します。 List<FileItem> items = fileUpload.getFileItems("files"); // すべてのファイル要素(file1, file2, file3, files, files, files)を取得します。 List<FileItem> items = fileUpload.getFileItems();