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でアクセスできます。