CommonsMultipartResolver
一、概述
public class CommonsMultipartResolver extends CommonsFileUploadSupport
implements MultipartResolver, ServletContextAware {
……
……
}
CommonsMultipartResolver是MultipartResolver接口的实现类
我们首先来简单说一下MultipartResolver
二、MultipartResolver
MultipartResolver是用于处理文件上传,当收到请求时DispatchServlet的checkMultipart()方法会调用MultipartResolver的isMultipart()方法判断请求中是否包含文件,如果请求数据中包含文件,则调用MultipartResolver的resolverMultipart()方法对请求的数据进行解析,然后将文件数据解析成MultipartFile并封装在MultipartHTTPServletRequest(继承了HTTPServletRequest)对象中,最后传递给Controller。
在MultipartResolver接口中有如下方法:
//判断是否存在文件流
boolean isMultipart(HttpServletRequest request);
//解析http请求,并将请求封装到MultipartHttpServletRequest对象中,
MultipartHttpServletRequest resolveMultipart(HttpservletRequest request);
//清理上传的资源
void cleanMultipart(HttpServletRequest request);
MultipartResolver的实现类如下图所示:
CommonsMultipartResolver和StandardServletMultipartResolver 是其实现类。
二者的区别:
第一个需要使用 Apache 的 commons-fileupload 等 jar 包支持,但它能在比较旧的 servlet 版本中使用。
第二个不需要第三方 jar 包支持,它使用 servlet 内置的上传功能,但是只能在 Servlet 3 以上的版本使用。
三、CommonsMultipartResolver
方法如下:
//清理所有资源
void cleanupMultipart(MultipartHttpServletRequest request);
//决定给定请求的编码
protected String determineEncoding(HttpServletRequest request);
//判断是否存在文件流
boolean isMultipart(HttpservletRequest request);
//解析给定的servlet请求,解析其多部分元素
protected CommonsFileUploadSupport.MultipartParsingResult parseRequest(HttpServletRequest request)
//将给定http请求解析为多部分文件和参数
MultipartHttpServletRequest resolveMultipart(HttpServletRequest request)
//设置是否在文件或参数访问时延迟解决多部分请求。
void setResolveLazily(boolean resolveLazily)
//设置ServletContext运行该对象的位置。
void setServletContext(ServletContext servletContext)
代码实现:
@RequestMapping(value = "/addproduct", method = RequestMethod.POST)
@ResponseBody
private Map<String, Object> addProduct(HttpServletRequest request) {
Map<String, Object> modelMap = new HashMap<String, Object>();
//接受前端参数的变量的初始化,包括商品、缩略图、详情图列表实体类
ObjectMapper mapper = new ObjectMapper();
Product product = null;
String productStr = HttpServiceRequestUtil.getString(request, "productStr");
MultipartHttpServletRequest multipartRequest = null;
ImageHolder thumbnail = null;
List<ImageHolder> productImgList = new ArrayList<ImageHolder>();
//通用的解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
try {
//若请求中存在文件流,则取出相关的文件(包括缩略图和详情图)
//isMutipart是用来判断是否有文件上传
if (multipartResolver.isMultipart(request)) {
multipartRequest = (MultipartHttpServletRequest) request;
//取出缩略图并构建ImageHolder对象
CommonsMultipartFile thumbnailFile = (CommonsMultipartFile) multipartRequest.getFile("thumbnail");
thumbnail = new ImageHolder(thumbnailFile.getOriginalFilename(), thumbnailFile.getInputStream());
//取出详情图列表并构建List<ImageHolder>列表对象,最多支持六张图片上传
for (int i = 0; i < IMAGEMAXCOUNT; i++) {
CommonsMultipartFile productImgFile = (CommonsMultipartFile) multipartRequest.getFile("productImg" + i);
if (productImgFile != null) {
ImageHolder productImg = new ImageHolder(productImgFile.getOriginalFilename(), productImgFile.getInputStream());
productImgList.add(productImg);
} else {
//若取出的第i个详情图片文件流为空,则终止循环
break;
}
}
} else {
modelMap.put("success", false);
modelMap.put("errMsg", "上传图片不能为空");
return modelMap;
}
} catch (Exception e) {
modelMap.put("success", false);
modelMap.put("errMsg", e.toString());
return modelMap;
}
}
参考:
SpringMVC中使用CommonsMultipartResolver进行文件上传
CommonsMultipartResovler API