对于文件上传也就是multipart数据请求,dispatcher并没有提供解析的实现,而是将他交给了spring的multipartResolver接口来实现,spring的内置实现主要有两种:
1、CommonsMultipartResolver : 依赖Jakarta Commons FileUpload
2、StandardServletMultiPartResolver : 依赖于servlet3.0
第二种方式不需要依赖外部组件的支持,而且配置请求的总体容量,所以建议用第二种方式。
首先在dispatcher上下文中注册MultipartResolver:
@Bean
public MultipartResolver multipartResolver() throws IOException {
//以servlet3.0的支持来进行文件上传
// return new StandardServletMultipartResolver();
//依赖commons fileupload组件
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
commonsMultipartResolver.setUploadTempDir(new FileSystemResource("/WEB-INF/uploads"));
commonsMultipartResolver.setMaxUploadSize(2*1024*1024);
commonsMultipartResolver.setMaxInMemorySize(0);
return commonsMultipartResolver;
}
上面包括两种方式的bean注册。
StandardServletMultipartResolver与CommonsMultipartResolver不同的一点在于他本身并没有提供配置方法,我们只能配置MultipartConfigElement来控制,在实现了AbstractAnnotationConfigDispatcherServletInitializer的类下重写customizeRegistration方法:
/**
* 配置Multipart请求参数
* @param registration 注册
*/
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
registration.setMultipartConfig(new MultipartConfigElement("/WEB-INF/uploads",
1024*1024*2, 1024*1024*4, 0));
}
这样配置就完成了,controller层接收文件时用MultipartFile或者part接口处理就可以了