springmvc会在http请求到来时先判断是否是Multipart文件上传,如果是,将request转换为MultipartHttpServletRequest:
StandardServletMultipartResolver的isMultipart()方法和CommonsMultipartResolver的基本一致,都是要“POST”请求并且contentType以“multipart/”开头。
MultipartResolver负责把request转换为MultipartHttpServletRequest,具体的参数解析仍然和之前的参数解析一致,这个handler的file参数会被RequestParamMethodArgumentResolver解析。
可以看到RequestParamMethodArgumentResolver的supportsParameter()方法里,当参数类型是Multipart的时候,RequestParamMethodArgumentResolver是支持解析的。
this.multipartResolver在DispatcherServlet初始化时进行赋值:
multipartResolver都是实现MultipartResolver接口,和其他参数类型Resolver实现的接口是不一样的:
CommonsMultipartResolver:
StandardServletMultipartResolver:
StandardServletMultipartResolver的isMultipart()方法和CommonsMultipartResolver的基本一致,都是要“POST”请求并且contentType以“multipart/”开头。
再来看看具体的handler:
MultipartResolver负责把request转换为MultipartHttpServletRequest,具体的参数解析仍然和之前的参数解析一致,这个handler的file参数会被RequestParamMethodArgumentResolver解析。
可以看到RequestParamMethodArgumentResolver的supportsParameter()方法里,当参数类型是Multipart的时候,RequestParamMethodArgumentResolver是支持解析的。
另外在DispatcherServlet中,请求结束的时候会对MultipartRequest做一个清理处理:
springmvc对文件上传的处理大致流程就分析完了。
接下来将会对@RequestPart以及springmvc实现restful风格URL进行分析。