注意:所有文章除特别说明外,转载请注明出处.
第17章 MultipartResolver
该组件有两个实现类:StandardServletMultipartResolver 和 CommonsMultipartResolver。前者使用Servlet3.0标准上传方式,后者使用Apache的commons-fileupload。
StandardServletMultipartResolver
该方法使用Servlet 3.0 标准的上传方式。在该方式下只需要调用request的getParts()方法就可以获取所有上传的文件。如果是单个的:request.getPart(fileName)。然后调用它到write(saveFileName)方法就能够将文件保存以saveFileName为文件名的文件。
该方法判断请求是否是上传请求:1.在isMultipart()方法中判断是否是post请求,如果是则再检查contentType是否是以”multipart/开头,如果是则判断该请求是上传请求。
CommonsMultipartResolver
该方法使用commons-fileupload来完成具体的上传操作。在CommonsMultipartResolver中判断是否是上传请求:isMultipart(),这将交给commons-fileupload的ServletFileUpload类完成。
public boolean isMultipart(HttpServletRequest request){
return (request != null && ServletFileUpload.isMultipartContent(request));
}
CommonsMultipartResolver中实际处理request的方法是:resolveMultipart()
public MultipartHttpServletRequest resolveMultipart(final HttpServletRequest request) throws MultipartException{
Assert.notNull(request, "request不能为空");
if(this.resolveLazily){
return new DefaultMultipartHttpServletRequest(request){
@Override
protected void initializeMultipart(){
...
}
}
}
}
总结
MultipartResolver的作用是将上传请求包装成可以直接获取File的request。所以此重点是从request中解析出上传的文件并设置到相应的上传类型request中。