Spring Framework源码(十):SpringMVC之文件上传
来源:互联网 发布:今日值得买网站源码 编辑:程序博客网 时间:2024/05/01 18:21
我们这一章讲SpringMVC中文件上传的应用,首先我们还是从DispatcherServlet这个核心分发器开始讲起:
processedRequest = checkMultipart(request);
还记得上一章讲doDispatch这个方法时见过的方法吧?现在我们来分析下这个方法的具体解析过程:
protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartException {//检测multipartResolver是否已经初始化(在initStrategies这个方法中已经初始化了这个处理器),解析request判断是否有文件上传if (this.multipartResolver != null && this.multipartResolver.isMultipart(request)) {//如果已经在web.xml配置了MultipartFilter过滤器并且已完成了解析则不需要再次处理requestif (WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class) != null) {logger.debug("Request is already a MultipartHttpServletRequest - if not in a forward, " +"this typically results from an additional MultipartFilter in web.xml");}//如果在此前解析request的过程中发生了异常则不需要再次处理requestelse if (request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) instanceof MultipartException) {logger.debug("Multipart resolution failed for current request before - " +"skipping re-resolution for undisturbed error rendering");}//非以上情况则解析requestelse {return this.multipartResolver.resolveMultipart(request);}}return request;}
以上完成了对request中是否有文件上传的判断,并返回了经过处理的request。但是到底springmvc是怎么解析request的呢?下面我们来看下MultipartResolver接口:
public interface MultipartResolver {//判断是否有文件上传boolean isMultipart(HttpServletRequest request);//解析requestMultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException;//清除文件上传内容void cleanupMultipart(MultipartHttpServletRequest request);}
我们以MultipartResolver的默认实现类StandardServletMultipartResolver为例进行讲解Multipart的解析过程,下面我们来看看isMultipart(HttpServletRequest)和resolveMultipart(HttpServletRequest)两个方法。
public boolean isMultipart(HttpServletRequest request) {//检测http的请求方式是否是postif (!"post".equals(request.getMethod().toLowerCase())) {return false;}//检查Content-Type,如果是以“multipart”开头则返回真String contentType = request.getContentType();return (contentType != null && contentType.toLowerCase().startsWith("multipart/"));}
不难看出如果http请求是post方式并且contentType(form标签的enctype="multipart/form-data")是“multipart/form-data”则说明该请求中附带文件需要处理。我们再看看resolveMultipart:
public MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException {return new StandardMultipartHttpServletRequest(request, this.resolveLazily);}
它将一个request包装成了一个StandardMultipartHttpServletRequest,这个类会使用parseRequest方法解析http报文,将上传文件封装成StandardMultipartFile挨个存储到MultiValueMap<String, MultipartFile>类型的map中并关联到处理后的request。至于这个map中的file怎么被绑定到controller的参数中我们将在下一章中再做介绍。
- Spring Framework源码(十):SpringMVC之文件上传
- Spring Framework源码(九):SpringMVC之从DispatcherServlet说起
- Spring Framework源码(十一):SpringMVC之URL匹配
- Spring Framework源码(八):SpringMVC概览
- springmvc 文件上传问题总结+spring上传文件源码解析
- SpringMVC 源码之文件上传 MultipartResolver
- springMVC文件上传源码
- Spring Framework源码(十二):SpringMVC之数据绑定、验证、转换
- Spring Framework源码(十三):SpringMVC之从ModelMap到页面渲染
- Spring SpringMVC文件上传错误(一)
- Spring SpringMVC文件上传错误(二)
- springMVC之文件上传
- springMVC之文件上传
- 【springMVC】之文件上传
- springMVC之文件上传
- springMVC之上传文件
- 文件上传之SpringMVC
- springmvc之文件上传
- Leetcode:Maximum Subarray
- 伪命题:微信开放JS-SDK,助力网页开发
- 教育已经插上互联网的翅膀,邢帅教育欢迎您
- Best Time to Buy and Sell Stock I II III
- ewgwg
- Spring Framework源码(十):SpringMVC之文件上传
- 重要开源协议的比较(BSD,Apache,GPL,LGPL,MIT) – 整理
- 杨辉三角形
- Servlet的基于annotation的服务端验证
- Cocos2d-x 3.2 -- 总结数学类Vec2/Size/Rect
- 限制UIAlertView上的TextField的输入字符长度
- apk应用版本更新,后台下载
- 1050.String Subtraction
- 字符串格式化符号含义