后端——框架——视图层框架——spring mvc——MultipartResolver
MutlipartResolver负责处理multipart/form-data类型的请求,spring mvc本身没有提供技术实现,而是依赖于其他技术。
MultipartResolver有两个实现类,其中CommonsMultipartResolver依赖于Apache Commons File upload,在使用时需要导入commons-io架包
StandardServletMultipartResolver依赖于原生的Servlet技术。
处理multipart/form-data数据的核心是获取请求中的输入流,当获取到输入流之后,后续的操作视具体的业务而定,如果是文件上传的请求,把输入流写到服务器的磁盘即可
1、CommonsMultipartResolver
使用CommonsMultipartResolver,获取请求的输入流是通过获取MultiPartFile对象,直接写在方法的参数中即可。
使用步骤如下:
第一步,创建CommonsMultipartResolver对象,注入到容器中,名称为multipartResolver
@Bean(name="multipartResolver")
public MultipartResolver getMultipartResolver() throws IOException {
// 创建对象
CommonsMultipartResolver multipart =
new CommonsMultipartResolver();
// 设置属性值
// 设置默认的编码格式
multipart.setDefaultEncoding("UTF-8");
// 5GB
multipart.setMaxInMemorySize(5 * 1024 * 1024 * 1024);
// 设置上传文件的大小
multipart.setMaxInMemorySize(25 * 1024 * 1024 * 1024);
// 设置单个上传文件的最大值,20M
multipart.setMaxUploadSizePerFile(20 * 1024 * 1024);
// 设置是否延迟解析multipart请求
multipart.setResolveLazily(false);
// 设置文件存放的临时目录
Resource tempDir = new FileSystemResource("");
multipart.setUploadTempDir(tempDir);
return multipart;
}
第二步,在Controller,在处理文件上传请求中添加Multipart参数。之后调用MultipartFile对象的API即可。
@PostMapping("/test/upload")
public String handleFileUpload(@RequestParam("testFile") MultipartFile file) {
return "";
}
2、StandardServletMultipartResolver
使用StandardServletMultipartResolver,获取请求输入流是通过Part对象,直接写在参数中即可
使用步骤如下:
第一步,创建StandardServletMultipartResolver对象,并注入,名称为multipartResolver
@Bean(name="multipartResolver")
public MultipartResolver getMultipartResolver() throws IOException {
return new StandardServletMultipartResolver();
}
第二步,在DispatcherServlet中添加multiConfig配置。MultipartConfigElement对象的所有属性都是通过构造器方式传入的。没有setXXX方法。
// 配置DispatcherServlet
// 创建DispatcherServlet对象
DispatcherServlet dp = new DispatcherServlet(context);
// 获取它的配置信息类,等价于在web.xml中配置servlet-name和servlet-class标签
ServletRegistration.Dynamic registration = servletContext.addServlet("dispatcherServlet", dp);
// Multipart配置对象
MultipartConfigElement multipartConfig = new MultipartConfigElement("D:\\tempDir");
registration.setMultipartConfig(multipartConfig);
第三步,在Controller,在处理文件上传请求中添加Part参数。