SpringMVC使用CommonsMultipartResolver上傳檔案
阿新 • • 發佈:2019-01-13
DispatcherServlet並沒有實現任何解析multipart請求資料的功能,它將該任務委託給了Spring中MultipartResolver策略介面的實現,通過該介面的實現類來解析multipart請求中的內容。從Spring3.1開始,Spring內建了兩個MultipartResolver的實現供我們選擇:
-
StandardServletMultipartResolver 依賴於Servlet3.0對multipart請求的支援(始於Spring3.1)
-
CommonsMultipartResolver 使用Jakarta Commons FileUpload解析multipart請求
一般來說,StandardServletMultipartResolver將會是優先選擇的方案,它使用了Servlet所提供的原生功能支援,並不需要依賴任何第三方元件。如果我們需要將應用部署到Servlet3.0之前的容器中,或者還沒有使用Spring3.1或者更高的版本,那麼可能就需要使用CommonsMultipartResolver了
(1)引入Jakarta相關jar包
1 <dependency> 2 <groupId>commons-fileupload</groupId> 3 <artifactId>commons-fileupload</artifactId> 4 <version>1.4</version> 5 </dependency> 6 7 <dependency> 8 <groupId>commons-io</groupId> 9 <artifactId>commons-io</artifactId> 10 <version>2.6</version> 11</dependency>
(2)將CommonsMultipartResolver新增到Spring容器中
1 @Bean 2 public MultipartResolver multipartResolver() throws IOException { 3 CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); 4 multipartResolver.setUploadTempDir(new FileSystemResource("/tmp/coreqi/uploads")); 5 multipartResolver.setMaxUploadSize(2097152); 6 multipartResolver.setMaxInMemorySize(0); 7 return multipartResolver; 8 }
(3)編寫上傳檔案的Form表單
將<form>標籤的enctype設定為multipart/form-data,這會告訴瀏覽器以multipart資料的形式提交表單,而不是以表單資料的形式進行提交。
1 <!DOCTYPE html> 2 <html lang="en" xmlns:th="http://www.thymeleaf.org"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>上傳頁面</title> 6 </head> 7 <body> 8 <form method="post" th:action="@{/file/upload}" enctype="multipart/form-data"> 9 描述:<input type="text" name="desc"/> 10 檔案:<input type="file" name="file" accept="image/jpeg,image/png,image/gif"/> 11 <input type="submit" value="上傳"/> 12 </form> 13 </body> 14 </html>
(4)編寫上傳的控制器
1 @PostMapping("/file/upload") 2 public String upload(@RequestParam String desc, @RequestParam MultipartFile file) throws IOException { 3 if(!file.isEmpty()){ 4 String filePath = "d:\\img\\"; 5 File fileDir = new File(filePath); 6 if(!fileDir.exists() && !fileDir.isDirectory()){ 7 fileDir.mkdir(); 8 } 9 file.transferTo(new File(filePath + file.getOriginalFilename())); 10 } 11 return "file/upload"; 12 }