有关MultipartResolver的一些疑惑

来源:4-6 店铺注册功能之Controller层的实现(上)

种苹果树的兔子

2020-11-25

    //1.3接收图片文件,使用Spring自带的CommonsMultipartFile
    CommonsMultipartFile shopImg = null;
    //文件解析器CommonsMultipartResolver来解析request里面的文件信息
    CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
    //检查form中是否有设置enctype="multipart/form-data"
    if (commonsMultipartResolver.isMultipart(request)) {
        //将request由HttpServletRequest类强制转换为MultipartHttpServletRequest类,后者继承了前者
        MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
        //将文件流提取出来,shopImg同样是在前端界面约定好的变量名称
        shopImg = (CommonsMultipartFile) multipartHttpServletRequest.getFile("shopImg");
    } else {
        modelMap.put("success", false);
        modelMap.put("errMsg", "上传图片不能为空");
        return modelMap;
    }

问题:
老师我想请教下,这段代码中为什么要获取一个CommonsMultipartResolver来调用isMultipart()这个方法?
我的想法:

  1. 我们已经在xml中配置了文件上传解析器,DispatcherServlet 应该会自动调用 MultipartResolver 的 isMultipart(request) 方法检查当前 Web 请求是否为 multipart类型。如果是,DispatcherServlet 将调用 MultipartResolver 的resolveMultipart(request) 方法,对原始 request 进行装饰,并返回一个 MultipartHttpServletRequest,我们只需要接收这个MultipartHttpServletRequest并提取文件就可以吧,为什么还要重复调用isMultipart()这个方法呢?
  2. 我感觉这个判断没有意义,这个方法应该只会检查enctype是否是="multipart/form-data"吧。我试过,如果不提交文件,会提示错误信息“请输入店铺信息”并不会提示“上传图片不能为空”这个信息,而且如果提交一个非图片文件,甚至不会报任何错误信息,会直接提示提交成功。

还望老师不吝赐教

写回答

1回答

翔仔

2020-11-26

同学好,咱们这样写主要是用来检查第三方提交的,也就是说不是通过我们网页进行请求的,https://coding.imooc.com/learn/questiondetail/29453.html


1
1
种苹果树的兔子
好的,谢谢老师
2020-11-26
共1条回复

Java双版本(SSM到SpringBoot)校园商铺全栈开发

SSM商铺V1.0,解决毕设痛点;SpringBoot商铺V2.0,满足工作刚需

5113 学习 · 8144 问题

查看课程