Hochladen von Dateien mit Spring MVC
1. Überblick
In früheren Artikeln haben wirintroduced the basics der Formularverarbeitung und dieform tag library in Spring MVC untersucht.
In diesem Artikel konzentrieren wir uns auf das, was Spring fürmultipart (file upload) support in Webanwendungen bietet.
Mit Spring können wir diese mehrteilige Unterstützung mit steckbarenMultipartResolver-Objekten aktivieren. Das Framework bietet eineMultipartResolver-Implementierung zur Verwendung mitCommons FileUpload und eine andere zur Verwendung mitServlet 3.0 mehrteiliger Anforderungsanalyse.
Nach dem Konfigurieren derMultipartResolver sehen wir, wie eine einzelne Datei und mehrere Dateien hochgeladen werden.
Wir werden auchSpring Boot. ansprechen
2. Commons FileUpload
UmCommonsMultipartResolver für den Datei-Upload zu verwenden, müssen Sie die folgende Abhängigkeit hinzufügen:
commons-fileupload
commons-fileupload
1.3.1
Jetzt können wir dieCommonsMultipartResolver-Bean in unserer Spring-Konfiguration definieren.
DieseMultipartResolver enthält eine Reihe vonset Methoden zum Definieren von Eigenschaften wie der maximalen Größe für Uploads:
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(100000);
return multipartResolver;
}
Hier müssen wir verschiedene Eigenschaften vonCommonsMultipartResolver in der Bean-Definition selbst steuern.
3. With Servlet 3.0
Um die mehrteilige Analyse vonServlet 3.0zu verwenden, müssen einige Teile der Anwendung konfiguriert werden. 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);
}
}
ImMultipartConfigElement-Objekt haben wir den Speicherort, die maximale Größe der einzelnen Dateien, die maximale Anforderungsgröße (bei mehreren Dateien in einer einzelnen Anforderung) und die Größe konfiguriert, bei der der Fortschritt des Datei-Uploads auf den gelöscht wird Speicherort.
Diese Einstellungen müssen auf der Servlet-Registrierungsebene angewendet werden, daServlet 3.0 nicht zulässt, dass sie inMultipartResolver registriert werden, wie dies beiCommonsMultipartResolver. der Fall ist
Sobald dies erledigt ist,we can add the StandardServletMultipartResolver to our Spring configuration:
@Bean
public StandardServletMultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}
4. Uploading a File **
Um unsere Datei hochzuladen, können wir eine einfache Form erstellen, in der wir ein HTMLinput-Tag mittype='file'. verwenden
Unabhängig von der von uns gewählten Konfiguration für die Upload-Verarbeitung müssen wir das Codierungsattribut des Formulars aufmultipart/form-data. setzen. Dadurch weiß der Browser, wie das Formular codiert wird:
Select a file to upload
To store the uploaded file we can use a MultipartFile variable. Wir können diese Variable aus dem Anforderungsparameter in der Methode unseres Controllers abrufen:
@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, einschließlich Dateiname, Dateityp usw. Wir können eine einfache HTML-Seite verwenden, um diese Informationen anzuzeigen:
Submitted File
OriginalFileName:
${file.originalFilename}
Type:
${file.contentType}
5. Hochladen Mehrere Dateien
Um mehrere Dateien in einer einzigen Anfrage hochzuladen, fügen wir einfach mehrere Eingabedateifelder in das Formular ein:
Select a file to upload
Select a file to upload
Select a file to upload
Wir müssen darauf achten, dass jedes Eingabefeld denselben Namen hat, damit auf es als Array vonMultipartFile zugegriffen werden kann:
@RequestMapping(value = "/uploadMultiFile", method = RequestMethod.POST)
public String submit(@RequestParam("files") MultipartFile[] files, ModelMap modelMap) {
modelMap.addAttribute("files", files);
return "fileUploadView";
}
Jetzt können wir einfach über dieses Array iterieren, um die Dateiinformationen anzuzeigen:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Spring MVC File Upload
Submitted Files
OriginalFileName:
${file.originalFilename}
Type:
${file.contentType}
6. Hochladen von Dateien mit zusätzlichen Formulardaten
Wir können auch zusätzliche Informationen zusammen mit der hochgeladenen Datei an den Server senden. Wir müssen nur die erforderlichen Felder in das Formular aufnehmen:
Name
Email
Select a file to upload
In der Steuerung können wir alle Formulardaten mithilfe der Annotation@RequestParamabrufen:
@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";
}
Ähnlich wie in den vorherigen Abschnitten können wir die HTML-Seite mitJSTL-Tags verwenden, um die Informationen anzuzeigen.
Wir können auch alle Formularfelder in einer Modellklasse kapseln und die Annotation@ModelAttributeim Controller verwenden. Dies ist hilfreich, wenn neben der Datei viele zusätzliche Felder vorhanden sind. Schauen wir uns den Code an:
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. Hochladen der Spring Boot-Datei
[.hps] [result_box]#If we’re using Spring Boot, everything we’ve seen so far still applies. # #
Mit Spring Boot ist es jedoch noch einfacher, alles mühelos zu konfigurieren und zu starten.
Insbesondere wirdit’s not necessary to configure any servlet, als Boot registriert und für uns konfiguriert, vorausgesetzt, wir nehmen das Webmodul in unsere Abhängigkeiten auf:
org.springframework.boot
spring-boot-starter-web
2.1.8.RELEASE
Wir können die neueste Version vonspring-boot-starter-web auf Maven Central finden.
Wenn wir die maximale Größe des Datei-Uploads steuern möchten, können wir unsereapplication.properties bearbeiten:
spring.servlet.multipart.max-file-size=128KB
spring.servlet.multipart.max-request-size=128KB
Wir können auch steuern, ob das Hochladen von Dateien aktiviert ist, und den Speicherort für das Hochladen von Dateien:
spring.servlet.multipart.enabled=true
spring.servlet.multipart.location=${java.io.tmpdir}
Beachten Sie, dass wir$\{java.io.tmpdir} verwendet haben, um den Upload-Speicherort zu definieren, damit wir den temporären Speicherort für verschiedene Betriebssysteme verwenden können.
8. Fazit
[.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. # #
Die Implementierung dieses Tutorials finden Sie inGitHub project. Wenn das Projekt lokal ausgeführt wird, kann auf das Formularbeispiel unterhttp://localhost:8080/spring-mvc-java/fileUpload zugegriffen werden