Spring MVCによるファイルアップロード

Spring MVCを使用したファイルのアップロード

1. 概要

以前の記事では、フォーム処理のintroduced the basicsを使用し、Spring MVCのform tag libraryを調べました。

この記事では、SpringがWebアプリケーションのmultipart (file upload) supportに提供するものに焦点を当てます。

Springを使用すると、プラグ可能なMultipartResolverオブジェクトを使用してこのマルチパートサポートを有効にできます。 フレームワークは、Commons FileUploadで使用するための1つのMultipartResolver実装と、Servlet 3.0マルチパート要求解析で使用するための別の実装を提供します。

MultipartResolverを構成した後、単一のファイルと複数のファイルをアップロードする方法を確認します。

Spring Boot.にも触れます

2. コモンズFileUpload

CommonsMultipartResolverを使用してファイルのアップロードを処理するには、次の依存関係を追加する必要があります。


    commons-fileupload
    commons-fileupload
    1.3.1

これで、CommonsMultipartResolverBeanをSpring構成に定義できます。

このMultipartResolverには、アップロードの最大サイズなどのプロパティを定義するための一連のsetメソッドが付属しています。

@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    multipartResolver.setMaxUploadSize(100000);
    return multipartResolver;
}

ここでは、Bean定義自体のCommonsMultipartResolverのさまざまなプロパティを制御する必要があります。

3. With サーブレット3.0

Servlet 3.0のマルチパート解析を使用するには、アプリケーションのいくつかの部分を構成する必要があります。 First, we need to set a MultipartConfigElement in our DispatcherServlet registration:

public class MainWebAppInitializer implements WebApplicationInitializer {

    private String TMP_FOLDER = "/tmp";
    private int MAX_UPLOAD_SIZE = 5 * 1024 * 1024;

    @Override
    public void onStartup(ServletContext sc) throws ServletException {

        ServletRegistration.Dynamic appServlet = sc.addServlet("mvc", new DispatcherServlet(
          new GenericWebApplicationContext()));

        appServlet.setLoadOnStartup(1);

        MultipartConfigElement multipartConfigElement = new MultipartConfigElement(TMP_FOLDER,
          MAX_UPLOAD_SIZE, MAX_UPLOAD_SIZE * 2, MAX_UPLOAD_SIZE / 2);

        appServlet.setMultipartConfig(multipartConfigElement);
    }
}

MultipartConfigElementオブジェクトでは、保存場所、個々の最大ファイルサイズ、最大リクエストサイズ(1つのリクエストに複数のファイルがある場合)、およびファイルのアップロードの進行状況がフラッシュされるサイズを構成しました。ストレージの場所。

これらの設定は、CommonsMultipartResolver.の場合のように、Servlet 3.0ではMultipartResolverに登録できないため、サーブレット登録レベルで適用する必要があります。

これが完了すると、we can add the StandardServletMultipartResolver to our Spring configuration:

@Bean
public StandardServletMultipartResolver multipartResolver() {
    return new StandardServletMultipartResolver();
}

4. Uploading a File **

ファイルをアップロードするために、type='file'.でHTMLinputタグを使用する単純なフォームを作成できます。

アップロード処理の構成に関係なく、フォームのエンコード属性をmultipart/form-data.に設定する必要があります。これにより、ブラウザーはフォームをエンコードする方法を知ることができます。


    
Select a file to upload

To store the uploaded file we can use a MultipartFile variable.この変数は、コントローラーのメソッド内のリクエストパラメーターから取得できます。

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public String submit(@RequestParam("file") MultipartFile file, ModelMap modelMap) {
    modelMap.addAttribute("file", file);
    return "fileUploadView";
}

The MultipartFile class provides access to details about the uploaded file、ファイル名、ファイルタイプなどを含みます。 簡単なHTMLページを使用して、この情報を表示できます。

Submitted File

OriginalFileName: ${file.originalFilename}
Type: ${file.contentType}

5. アップロード中 複数のファイル

1つのリクエストで複数のファイルをアップロードするには、フォーム内に複数の入力ファイルフィールドを配置するだけです。


    
Select a file to upload
Select a file to upload
Select a file to upload

MultipartFileの配列としてアクセスできるように、各入力フィールドの名前が同じであることに注意する必要があります。

@RequestMapping(value = "/uploadMultiFile", method = RequestMethod.POST)
public String submit(@RequestParam("files") MultipartFile[] files, ModelMap modelMap) {
    modelMap.addAttribute("files", files);
    return "fileUploadView";
}

これで、その配列を単純に繰り返してファイル情報を表示できます。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    
        Spring MVC File Upload
    
    
        

Submitted Files

OriginalFileName: ${file.originalFilename}
Type: ${file.contentType}

6. 追加のフォームデータを含むファイルのアップロード

また、アップロードするファイルとともに追加情報をサーバーに送信することもできます。 フォームに必須フィールドを含めるだけです。


    
Name
Email
Select a file to upload

コントローラでは、@RequestParamアノテーションを使用してすべてのフォームデータを取得できます。

@PostMapping("/uploadFileWithAddtionalData")
public String submit(
  @RequestParam MultipartFile file, @RequestParam String name,
  @RequestParam String email, ModelMap modelMap) {

    modelMap.addAttribute("name", name);
    modelMap.addAttribute("email", email);
    modelMap.addAttribute("file", file);
    return "fileUploadView";
}

前のセクションと同様に、JSTLタグ付きのHTMLページを使用して情報を表示できます。

モデルクラスのすべてのフォームフィールドをカプセル化し、コントローラーで@ModelAttributeアノテーションを使用することもできます。 これは、ファイルとともに追加のフィールドがたくさんある場合に役立ちます。 コードを見てみましょう:

public class FormDataWithFile {

    private String name;
    private String email;
    private MultipartFile file;

    // standard getters and setters
}
@PostMapping("/uploadFileModelAttribute")
public String submit(@ModelAttribute FormDataWithFile formDataWithFile, ModelMap modelMap) {

    modelMap.addAttribute("formDataWithFile", formDataWithFile);
    return "fileUploadView";
}

7. SpringBootファイルのアップロード

[.hps] [result_box]#If we’re using Spring Boot, everything we’ve seen so far still applies. #

ただし、Spring Bootを使用すると、簡単にすべてを設定して起動できます。

特に、依存関係にWebモジュールが含まれている場合、ブートとしてのit’s not necessary to configure any servlet,が登録および構成します。


    org.springframework.boot
    spring-boot-starter-web
    2.1.8.RELEASE

Maven Centralで最新バージョンのspring-boot-starter-webを見つけることができます。

ファイルの最大アップロードサイズを制御する場合は、application.propertiesを編集できます。

spring.servlet.multipart.max-file-size=128KB
spring.servlet.multipart.max-request-size=128KB

また、ファイルのアップロードを有効にするかどうか、およびファイルのアップロード場所を制御できます。

spring.servlet.multipart.enabled=true
spring.servlet.multipart.location=${java.io.tmpdir}

$\{java.io.tmpdir}を使用してアップロード場所を定義しているため、さまざまなオペレーティングシステムで一時的な場所を使用できます。

8. 結論

[.hps] [result_box]#In this article, we looked at different ways to configure multipart support in Spring. Using these, we can support file uploads in our web applications. #

このチュートリアルの実装は、GitHub projectにあります。 プロジェクトがローカルで実行されている場合、フォームの例にはhttp://localhost:8080/spring-mvc-java/fileUploadでアクセスできます。