www.dextsolution.com
DEXTUPLOAD
NJ
menu toggle製品の説明 > ファイルのアップロード(Spring Web Framework)

ファイルのアップロード(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メソッドを呼び出して処理する。

DEXTUploadNJMultipartResolverEnvironmentオブジェクトを持って事前設定タスクを実行することができる。 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");

もし記録する場所に同じ名前のファイルが存在する場合、ファイル名の後ろに(数字)が付く。