后端——框架——视图层框架——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参数。

相关