1. 程式人生 > >SpringMVC使用StandardServletMultipartResolver上傳文件

SpringMVC使用StandardServletMultipartResolver上傳文件

servle gist bmi ans 接口 mon itl org 指定

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)將StandardServletMultipartResolver添加到Spring容器中

1     @Bean
2     public MultipartResolver multipartResolver(){
3         return
new StandardServletMultipartResolver(); 4 }

(2)在Servlet中(DispatcherServlet)指定multipart的配置

 1     @Override
 2     protected void customizeRegistration(ServletRegistration.Dynamic registration) {
 3         super.customizeRegistration(registration);
 4         String location = "d:\\tmp\\";
 5
File file = new File(location); 6 if(!file.exists() && !file.isDirectory()){ 7 file.mkdir(); 8 } 9 long maxFileSize = 2097152; //2M 10 long maxRequestSize = 4194304; //4M 11 int fileSizeThreshold = 0; 12 MultipartConfigElement multipartConfigElement = new MultipartConfigElement(location,maxFileSize,maxRequestSize,fileSizeThreshold); 13 registration.setMultipartConfig(multipartConfigElement);//配置對multipart的支持 14 }

(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     }

SpringMVC使用StandardServletMultipartResolver上傳文件