MultipartResolv和CommonsMultipartResolver详解

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值