1概要

これまでの記事では、フォーム処理の/spring-mvc-form-tutorial[基本]をリンクし、Spring MVCでリンク:/spring-mvc-form-tags[フォームタグライブラリ]を調べました。

この記事では、SpringがWebアプリケーションの

マルチパート(ファイルアップロード)サポート

に提供するものに焦点を当てます。

Springでは、プラグイン可能な

MultipartResolver

オブジェクトを使用してこのマルチパートサポートを有効にすることができます。フレームワークは、

Commons FileUpload

で使用するための

MultipartResolver

実装と、

Servlet 3.0

マルチパート要求解析で使用するための別の実装を提供します。


MultipartResolver

を設定したら、単一ファイルと複数ファイルをアップロードする方法を確認します。

また、Spring Bootについても触れます。


2.


Commons FileUpload


CommonsMultipartResolver

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

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>

これで

CommonsMultipartResolver

BeanをSpringの設定に定義できます。

この

MultipartResolver

には、アップロードの最大サイズなどのプロパティを定義するための一連の

set

メソッドが付属しています。

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


3


サーブレット3.0

あり


Servlet 3.0

マルチパート解析を使用するには、アプリケーションをいくつか構成する必要があります。 ** まず、

DispatcherServlet


registration



MultipartConfigElement

を設定する必要があります。

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

オブジェクトでは、保存場所、最大個別ファイルサイズ、最大要求サイズ(単一の要求に複数のファイルがある場合)、およびファイルのアップロードの進行状況が保存場所にフラッシュされるサイズを設定しました。


CommonsMultipartResolver.

の場合のように

Servlet 3.0

では

MultipartResolver

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

これが完了したら、

StandardServletMultipartResolver

をSpringの設定に追加できます。

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

** 4ファイルをアップロードする+

**

ファイルをアップロードするには、HTMLの

input

タグと

type = ‘file’ .

を使用した簡単なフォームを作成します。

アップロード処理の設定にかかわらず、フォームのencoding属性を__multipart/form-dataに設定する必要があります。これによりブラウザはフォームのエンコード方法を知ることができます。

<form:form method="POST" action="/spring-mvc-xml/uploadFile" enctype="multipart/form-data">
    <table>
        <tr>
            <td><form:label path="file">Select a file to upload</form:label></td>
            <td><input type="file" name="file"/></td>
        </tr>
        <tr>
            <td><input type="submit" value="Submit"/></td>
        </tr>
    </table>
</form>

  • アップロードされたファイルを保存するために

    MultipartFile

    変数を使用することができます** この変数はコントローラのメソッド内のrequestパラメータから取得することができます。

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


  • MultipartFile

    クラスは、ファイル名、ファイルタイプなどを含むアップロードされたファイルに関する詳細へのアクセスを提供します。この情報を表示するために単純なHTMLページを使用することができます。

<h2>Submitted File</h2>
<table>
    <tr>
        <td>OriginalFileName:</td>
        <td>${file.originalFilename}</td>
    </tr>
    <tr>
        <td>Type:</td>
        <td>${file.contentType}</td>
    </tr>
</table>

** 5複数のファイルをアップロードする

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

<form:form method="POST" action="/spring-mvc-java/uploadMultiFile" enctype="multipart/form-data">
    <table>
        <tr>
            <td>Select a file to upload</td>
            <td><input type="file" name="files"/></td>
        </tr>
        <tr>
            <td>Select a file to upload</td>
            <td><input type="file" name="files"/></td>
        </tr>
        <tr>
            <td>Select a file to upload</td>
            <td><input type="file" name="files"/></td>
        </tr>
        <tr>
            <td><input type="submit" value="Submit"/></td>
        </tr>
    </table>
</form:form>


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" %>
<html>
    <head>
        <title>Spring MVC File Upload</title>
    </head>
    <body>
        <h2>Submitted Files</h2>
        <table>
            <c:forEach items="${files}" var="file">
                <tr>
                    <td>OriginalFileName:</td>
                    <td>${file.originalFilename}</td>
                </tr>
                <tr>
                    <td>Type:</td>
                    <td>${file.contentType}</td>
                </tr>
            </c:forEach>
        </table>
    </body>
</html>


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

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

<form:form method="POST"
  action="/spring-mvc-java/uploadFileWithAddtionalData"
  enctype="multipart/form-data">
    <table>
        <tr>
            <td>Name</td>
            <td><input type="text" name="name"/></td>
        </tr>
        <tr>
            <td>Email</td>
            <td><input type="text" name="email"/></td>
        </tr>
        <tr>
            <td>Select a file to upload</td>
            <td><input type="file" name="file"/></td>
        </tr>
        <tr>
            <td><input type="submit" value="Submit"/></td>
        </tr>
    </table>
</form:form>

コントローラでは、

@ 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. Spring Bootファイルのアップロード

**

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

特に、依存関係にWebモジュールが含まれていれば、Bootが登録して設定するので、サーブレットを設定する必要はありません。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>1.5.10.RELEASE</version>
</dependency>

私たちは

httpsの最新版を見つけることができます。 Maven Centralのweb%22[spring-boot-starter-web]

最大ファイルアップロードサイズを制御したい場合は、

application.properties

を編集できます。

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


8結論

このチュートリアルの実装は、

GitHub
プロジェクト

。プロジェクトがローカルで実行されている場合、フォームの例は次のようになります。

http://localhost:8080/spring-mvc-java/fileUploadでアクセスします。