今天看了一下,MultipartResolver,总结一下
spring的MultipartResolver可以帮助上传文件,
先看定义
public interface MultipartResolver {
boolean isMultipart(HttpServletRequest request);
MultipartHttpServletRequest resolverMultipart(HttpServletRequest request);
void cleanupMultipart(MultipartHttpServletRequest request);
}
当用户的请求到DispatcherServlet时,
1, DispatcherServlet会先在webapplicationContext.xml中找一个名为“multipartResolver”的bean.
2, 如果有,则调用MultipartResolver的第一个方法,该方法会返回这个请求是否是通过enctype=”multipart/form-data”方式提交的,如果是,则调用第二个方法的,这个方法会把当前的HttpServletRequest换成MultipartHttpServletRequest,并传给后面的Controller处理
3, 如果没有这个bean(也可以修改DispatcherServlet的 MULTIPART_RESOLVER_BEAN_NAME属性来修改查找的名字),或者第一个方法没有返回true,则不做处理,继续传递HttpServletRequest
大费周章把HttpServletRequest换成MultipartHttpServletRequest,再来看看spring怎么定义这个HttpServletRequest的,
public interface MultipartHttpServketRequest extends HttpServletRequest,MultiPartRequest{
}
public interface MultipartRequest{
Iterator getFileNames();
MultipartFile getFile(String name);
Map getFileMap();
}
MultipartHttpServletRequest的附加能力来自父接口,
简单的说现在处理文件上传的Controller可以直接通过
MultipartHttpServletRequest request = (MultipartHttpServletRequest)request;
MultipartFile file = request.getFile("fileName");
得到上传的文件,之后怎么操作就看你的需要
而当你使用玩MultipartResolver后,DispatcherServlet将保证调用,该接口的第三个方法,来释放系统资源,这样也大大方便了。
spring为MultipartResolver提供两个可用的实现类:
org.springframework.web.multipart.commons.CommonsMultipartResolver(CommonsFileUpload类库实现,要倒包)
org.springframework.web.multipart.cos.CosMultipartResolver(OreillyCos类库实现,倒包)
当然这两个类其中还有一些属性,来控制文件上传的行为,比如: “maxUploadSize”, “maxInMemorySize” and “defaultEncoding”
这些属性都是继承来的,如图
如果不去关心细节的话,简单的用法就这样。(还是应该多看源码。。o.o)
望道友指正!
(还有一个,以前上传图片的时候都是上传到项目之外的其他盘,今天发现一个问题,在网络上读服务器其他盘的图片的时候有个小问题,当你在其他电脑上传后读取图片的时候,浏览器会出现“Not allowed to load local resource”,最好是方法项目中,然后读取就不会出现这个错了)