SpringMVC使用StandardServletMultipartResolver上传文件

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容器中

     @Bean
public MultipartResolver multipartResolver(){
return new StandardServletMultipartResolver();
}

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

     @Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
super.customizeRegistration(registration);
String location = "d:\\tmp\\";
File file = new File(location);
if(!file.exists() && !file.isDirectory()){
file.mkdir();
}
long maxFileSize = 2097152; //2M
long maxRequestSize = 4194304; //4M
int fileSizeThreshold = 0;
MultipartConfigElement multipartConfigElement = new MultipartConfigElement(location,maxFileSize,maxRequestSize,fileSizeThreshold);
registration.setMultipartConfig(multipartConfigElement);//配置对multipart的支持
}

(3)编写上传文件的Form表单

将<form>标签的enctype设置为multipart/form-data,这会告诉浏览器以multipart数据的形式提交表单,而不是以表单数据的形式进行提交。

 <!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>上传页面</title>
</head>
<body>
<form method="post" th:action="@{/file/upload}" enctype="multipart/form-data">
描述:<input type="text" name="desc"/>
文件:<input type="file" name="file" accept="image/jpeg,image/png,image/gif"/>
<input type="submit" value="上传"/>
</form>
</body>
</html>

(4)编写上传的控制器

     @PostMapping("/file/upload")
public String upload(@RequestParam String desc, @RequestParam MultipartFile file) throws IOException {
if(!file.isEmpty()){
String filePath = "d:\\img\\";
File fileDir = new File(filePath);
if(!fileDir.exists() && !fileDir.isDirectory()){
fileDir.mkdir();
}
file.transferTo(new File(filePath + file.getOriginalFilename()));
}
return "file/upload";
}
上一篇:dropdownlist无刷新传值


下一篇:Web App, Native APP,Hybird App 介绍