SpringMVC使用CommonsMultipartResolver上传文件

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     }

 

posted @ 2019-01-12 23:58  SpringCore  阅读(5311)  评论(0编辑  收藏  举报