ファイルのアップロード(Spring Web Framework)
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メソッドを使用すると、データにアクセスすることができる。
一般JSP / Servlet環境とは異なり、Spring Web FrameworkはCommonMultipartResovlerクラスの空(bean)を使用してマルチパートデータを自動的に分離する。 DEXTUploadNJはCommonMultipartResovlerクラスのように、自動的にデータを分離して、ビジネスロジックを実装するのに便利なようにDEXTUploadNJMultipartResolverクラスを提供する。
<bean id="multipartResolver" class="devpia.dextuploadnj.support.spring.DEXTUploadNJMultipartResolver"> <property name="environment" ref="environment"/> </bean>
DEXTUploadNJMultipartResolverは既存のCommonMultipartResovlerを交換しているので、同じURLマッピング船上で二空を重複して宣言するべきではない。 もし* .doパスにdispatcherサーブレットがマッピングされており、当該dispatcher設定DEXTUploadNJMultipartResolverが宣言された場合、* .doマッピングでCommonMultipartResovlerが一緒に動作するように宣言してはならないということだ。
- 一時ディレクトリとデフォルトのディレクトリ
-
DEXTUploadNJは、アップロードされたファイルの情報をメモリ上に記録するのではなく、一時ディレクトリに記録する。このプロセスは、DEXTUploadNJMultipartResolverオブジェクトのresolveMultipartメソッドが実行時に実行され、実際の保存がされるべき場所にファイルを記録(移動またはコピー)することは、マップされたコントローラのメソッドでFileItemインタフェースのsave、saveAsメソッドを呼び出して処理する。
DEXTUploadNJMultipartResolverはEnvironmentオブジェクトを持って事前設定タスクを実行することができる。 EnvironmentオブジェクトはDEXTUploadNJMultipartResolverのenvironment属性に設定する必要があるため、すべての設定は、dispatcherサーブレットの設定(一般的にはXML)で決定する。
<bean id="environment" class="devpia.dextuploadnj.Environment"> <property name="tempRepository" value="/file/temp"/> <property name="defaultRepository" value="/file/attach"/> <property name="autoMakingDirectory" value="true"/> <property name="licenseFilePath" value="..."/> </bean> <bean id="multipartResolver" class="devpia.dextuploadnj.support.spring.DEXTUploadNJMultipartResolver"> <property name="environment" ref="environment"/> </bean>
- コントローラにマップされたメソッドの形式
-
DEXTUploadNJMultipartResolverオブジェクトは、フォームデータを分離し、一時ファイルを生成する役割まで処理する。 この後、一時ファイルを実際に保存する場所に移動したり、コピーする作業は、実装しようとするサービスに応じて異なりますので、コントローラにマッピングされたメソッドで処理しなければならない。
DEXTUploadNJMultipartResolverはCommonsMultipartResolverを使用したファイルのアップロード処理方法と同様に、コントローラのマッピングメソッドでorg.springframework.web.multipart.MultipartFileパラメータオブジェクトを使用して、ファイルの情報を得る。 MultipartFileは既存のSpring Framework MVCでorg.springframework.web.multipart.commons.CommonsMultipartFileクラスが実装するが、DEXTUploadNJMultipartResolverを使用すると、CommonsMultipartFileではなく、DEXTUploadNJMultipartFileが代わりにして実装される。
@RequestMapping(value = "/common.do", method = RequestMethod.POST) public String upload(@RequestParam(value = "file1") MultipartFile file1) throws IOException { // file1パラメータオブジェクトをFileItemインターフェイスにキャストしたり、 FileItem item = (FileItem)file1; // またはDEXTUploadNJMultipartFileクラスにキャストする。 DEXTUploadNJMultipartFile item = (DEXTUploadNJMultipartFile)file1; ... return "view名やredirection処理"; } // 複数のファイルを一度に受信した場合には、配列を使用することができる。 @RequestMapping(value = "/common.do", method = RequestMethod.POST) public String upload(@RequestParam(value = "files") MultipartFile[] files) throws IOException { ... } - ファイルの保存場所と名前を変更する
-
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");もし記録する場所に同じ名前のファイルが存在する場合、ファイル名の後ろに(数字)が付く。