Spring MVC的文件上传是通过MultipartResolver处理的。
它有两个实现类:
CommonsMultipartResolver:依赖于第三方包。
StandardServletMultipartResolver:是Spring3.1版本后的产物。
可通过注解配置MultipartResolver,写在WebConfig类中。
multipartResolver是Spring约定好的Bean name,不可修改。
通过java配置Spring MVC初始化时,只需继承一个类,AbstractAnnotationConfigDispatcherServletInitializer。
通过覆盖方法,customizeRegistration,用于初始化DispatcherServlet设置的方法,配置关于文件上传的一些属性。
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
//Spring IoC容器配置
@Override
protected Class<?>[] getRootConfigClasses() {
//可以返回Spring的Java配置文件数组
return new Class<?>[] {};
}
//DispatcherServlet的URI映射关系配置
@Override
protected Class<?>[] getServletConfigClasses() {
//可以返回Spring的Java配置文件数组
return new Class<?>[] { WebConfig.class };
}
//DispatchServlet[修改为:DispatcherServlet]拦截请求匹配
@Override
protected String[] getServletMappings() {
return new String[] { "*.do" };
}
/**
* @param dynamic Servlet动态加载配置
*/
@Override
protected void customizeRegistration(Dynamic dynamic) {
//文件上传路径
String filepath = "e:/mvc/uploads";
//5MB
Long singleMax = (long) (5*Math.pow(2, 20));
//10MB
Long totalMax = (long) (10*Math.pow(2, 20));
//配置MultipartResolver,限制请求,单个文件5MB,总共文件10MB
dynamic.setMultipartConfig(new MultipartConfigElement(filepath, singleMax, totalMax, 0));
}
}
使用XML配置:
对MultipartReolver解析的调度,是通过DispatcherServlet进行的。
判定是否有enctype="multipart/*"请求,并且存在multipartResolver的Bean定义。
则Spring MVC将HttpServletRequest请求转换为MultipartHttpServletRequest请求对象。
在Controller中,使用HttpServletRequest作为方法参数,会造成API侵入。
可修改MultipartFile(Spring MVC提供的类)或者Part类对象(Servlet API提供的类)。
使用MultipartFile:
使用Part: