ファイルのアップロード(Spring MVC)
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メソッドを使用するとデータにアクセスできます。
Servlet / JSP環境とは異なり、Spring MVCはCommonMultipartResovlerクラスのBeanを使用してマルチパートデータを自動的に分離します。 DEXTUploadJKは、CommonMultipartResovlerクラスのように自動的にデータを分離し、ビジネスロジックを実装するのに便利なJKMultipartResolverクラスを提供します。
<bean id="multipartResolver" class="dextuploadjk.support.spring.JKMultipartResolver"> <property name="environment" ref="environment"/> </bean>
JKMultipartResolverは既存のCommonMultipartResovlerを置き換えているため、同じURLマッピング線上で2つのBeanオブジェクトを重複して宣言しないでください。もし*.doパスにDispatcherServletがマップされていて、そのコンテキスト設定で JKMultipartResolverが宣言されている場合、*.doマッピングでCommonMultipartResovlerが一緒に動作することを宣言してはいけないということだ。
- 一時ディレクトリと基本ディレクトリ
-
DEXTUploadJKは、アップロードされたファイル情報をメモリに記録するのではなく、一時ディレクトリに書き込みます。 この処理は、JKMultipartResolverオブジェクトのresolveMultipartメソッドが実行されたときに実行されます。 実際に保存する場所にファイルを書き込む(移動またはコピーする)作業は、マッピングされたコントローラのメソッドでFileItemインタフェースのsave、saveAsメソッドを呼び出して処理します。
JKMultipartResolverはEnvironmentオブジェクトを使ってプリセット操作を実行できます。 EnvironmentオブジェクトはJKMultipartResolver のenvironment属性に設定する必要があるため、 すべての設定は、コンテキストサーブレット設定(通常はXML)で決定されます。
<bean id="environment" class="dextuploadjk.engine.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="dextuploadjk.support.spring.JKMultipartResolver"> <property name="environment" ref="environment"/> </bean> - コントローラにマッピングされたメソッドの型
-
JKMultipartResolver オブジェクトはマルチパートデータを分析し、一時ファイルを作成する役割までのみ処理します。 この後、一時ファイルを実際に保存する場所に移動またはコピーする作業は、実装したいサービスによって異なるため、コントローラにマッピングされたメソッドで処理する必要があります。
JKMultipartResolverは、CommonsMultipartResolverを使用したファイルアップロードの処理方法と同じです。 コントローラのマッピングメソッドでorg.springframework.web.multipart.MultipartFileパラメータオブジェクトを介してファイル情報を取得します。 MultipartFileは既存のSpring MVCでorg.springframework.web.multipart.commons.CommonsMultipartFileクラスが実装しますが、 JKMultipartResolver を使用すると、CommonsMultipartFile ではなく、 JKMultipartFile が代わる。
@RequestMapping(value = "/upload.do", method = RequestMethod.POST) public String upload(@RequestParam(value = "file1") MultipartFile file1) throws IOException { // file1 パラメータオブジェクトを FileItem インタフェースにキャストするか、 FileItem item = (FileItem)file1; // またはJKMultipartFileクラスにキャストします。 JKMultipartFile item = (JKMultipartFile)file1; ... } // 複数のファイルを一度に受け取る場合には配列を使うことができる。 @RequestMapping(value = "/upload.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’ パスに書き込む。 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);記録する場所に同じ名前のファイルが存在する場合、ファイル名の後に(数字)が付く。