更新時間:2022-11-07 09:53:45 來源:動力節點 瀏覽1392次
在本SpringMVC教程中,我們將重點介紹 Spring 為Web 應用程序中的多部分(文件上傳)支持提供的功能。
Spring 允許我們使用可插入的MultipartResolver對象啟用這種多部分支持。該框架提供了一個用于Commons FileUpload的MultipartResolver實現和另一個用于Servlet 3.0多部分請求解析的實現。
配置MultipartResolver后,我們將看到如何上傳單個文件和多個文件。
我們還將涉及Spring Boot。
要使用CommonsMultipartResolver處理文件上傳,我們需要添加以下依賴項:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
現在我們可以在 Spring 配置中定義CommonsMultipartResolver bean。
這個MultipartResolver帶有一系列set方法來定義屬性,例如上傳的最大大小:
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(100000);
return multipartResolver;
}
這里我們需要在 Bean 定義本身中控制CommonsMultipartResolver的不同屬性。
為了使用Servlet 3.0多部分解析,我們需要配置幾個應用程序。
首先,我們需要在DispatcherServlet注冊中設置一個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對象中,我們配置了存儲位置、最大單個文件大小、最大請求大小(在單個請求中有多個文件的情況下)以及文件上傳進度刷新到存儲位置的大小。
這些設置必須在 servlet 注冊級別應用,因為Servlet 3.0不允許像CommonsMultipartResolver那樣在MultipartResolver中注冊它們。
完成后,我們可以將StandardServletMultipartResolver添加到 Spring 配置中:
@Bean
public StandardServletMultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}
要上傳我們的文件,我們可以構建一個簡單的表單,在該表單中使用帶有type='file'的 HTML輸入標簽。
無論我們選擇哪種上傳處理配置,我們都需要將表單的編碼屬性設置為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變量。
我們可以從控制器方法中的請求參數中檢索此變量:
@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>
要在單個請求中上傳多個文件,我們只需在表單中放置多個輸入文件字段:
<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>
我們還可以將附加信息與正在上傳的文件一起發送到服務器。
我們只需在表單中包含必填字段:
<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";
}
如果我們使用Spring的引導,到目前為止,我們看到的所有東西都仍然適用。
然而,Spring引導使其更容易配置和啟動一切麻煩。
特別是,它沒有必要配置啟動以來的任何servlet將注冊和配置它對于我們來說,如果我們在依賴關系包括web模塊:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.2</version>
</dependency>
我們能找到的最新版本spring-boot-starter-web Maven中央。
如果我們想控制最大文件上傳大小,我們可以編輯我們的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}來定義上傳位置,以便我們可以將臨時位置用于不同的操作系統。如果大家想了解更多相關知識,不妨來關注一下本站的SpringMVC視頻教程,里面的課程內容細致全面,通俗易懂,很適合小白學習,希望對大家能夠有所幫助哦。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習