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

ファイルのアップロード(Spring Boot)

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メソッドを使用するとデータにアクセスできます。

Spring BootはStandardServletMultipartResolverを使用してマルチパートデータを自動的に分離します。 DEXTUploadJKは、StandardServletMultipartResolverのようにデータを自動的に分離してビジネスロジックを実装するのに便利なように、 JKMultipartResolver クラスを提供します。

@Bean(name = "multipartResolver")
MultipartResolver createMultipartResolver(ServletContext context) {
    Environment env = new Environment();
    ...		
    JKMultipartResolver rs = new JKMultipartResolver();
    rs.setEnvironment(env);
    return rs;
}
一時ディレクトリと基本ディレクトリ

DEXTUploadJKは、アップロードされたファイル情報をメモリに記録するのではなく、一時ディレクトリに書き込みます。 この処理は、JKMultipartResolverオブジェクトのresolveMultipartメソッドが実行されたときに実行されます。 実際に保存する場所にファイルを書き込む(移動またはコピーする)作業は、マッピングされたコントローラのメソッドでFileItemインタフェースのsave、saveAsメソッドを呼び出して処理します。

JKMultipartResolverEnvironmentオブジェクトを使ってプリセット操作を実行できます。 EnvironmentオブジェクトはJKMultipartResolver のenvironment属性に設定する必要があるため、 JKMultipartResolverオブジェクトを作成する時点で設定をしてください。

@Bean(name = "multipartResolver")
MultipartResolver createMultipartResolver(ServletContext context) {
    Environment env = new Environment();
    env.setTempRepository("/files/temp");
    env.setDefaultRepository("/files/store");
    env.setLicenseFilePath("/license/dextuploadjk.config");
    env.setAutoMakingDirectory(true);
    env.setMaxFileSize(1024 * 1024 * 20);
    env.setMaxTotalSize(1024 * 1024 * 50);
    env.setWhiteExtensions("jpg,gif,png,doc,xls,ppt,docx,xlsx,pptx,pdf,txt,zip,hwp,mp4");
    	
    JKMultipartResolver rs = new JKMultipartResolver();
    rs.setEnvironment(env);
    return rs;
}
コントローラにマッピングされたメソッドの型

JKMultipartResolver オブジェクトはマルチパートデータを分析し、一時ファイルを作成する役割までのみ処理します。 この後、一時ファイルを実際に保存する場所に移動またはコピーする作業は、実装したいサービスによって異なるため、コントローラにマッピングされたメソッドで処理する必要があります。

JKMultipartResolver コントローラのマッピングメソッドでorg.springframework.web.multipart.MultipartFileパラメータオブジェクトを介してファイル情報を取得します。

@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);

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