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 }
原文地址:https://www.cnblogs.com/fanqisoft/p/10261536.html
时间: 2024-10-06 14:42:55