SpringMVC 上传文件两个解析器配置和区别

在Web应用中,允许用户上传内容是很常见的需求。很多网站都需要提供上传头像上传图片或者其他类型的文件的功能。我们都知道如果使用SpringMVC 开发时如果需要实现上传功能时需要单独配置一个multipart形式数据的解析器。通过它来钙素DispatcherServlet该如何读取multipart请求。
DispatcherServlet并没有实现任何解析multipart请求的功能。它将该任务委托给了Spring中MultipartResolver策略接口的实现,通过这个实现类来解析multipart请求中的内容。

SpringMVC处理上传的简要流程

DispatcherServlet 处理请求时先判断是否是multipart请求,如果是则对这个请求先进行multipart请求处理。

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HttpServletRequest processedRequest = request;
        HandlerExecutionChain mappedHandler = null;
        boolean multipartRequestParsed = false;

        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

        try {
            ModelAndView mv = null;
            Exception dispatchException = null;

            try {
                     //检查是否是multipart请求
                processedRequest = checkMultipart(request);
                multipartRequestParsed = (processedRequest != request);
.....
}

protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartException {
        if (this.multipartResolver != null && this.multipartResolver.isMultipart(request)) {
            if (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");
            }
            else 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");
            }
            else {
                return this.multipartResolver.resolveMultipart(request);
            }
        }
        // If not returned before: return original request.
        return request;
    }

SpringMVC支持的两种MultipartResolver

SpringMVC内置了两个MultipartResolver的实现供我们选择:

  • CommonsMultipartResolver :使用jakarta Commons FileUpload解析multipart请求。
  • StandardServletMultipartResolver: 依赖于Servlet3.0对multipart请求的支持。
    一般来讲,在这两者之间StandardServletMultipartResolver是优选方案。他使用Servlet所提供的功能支持,并不需要依赖任何其他项目。但是如果应用需要部署在Servlet3.0之前的容器中,那么只能选择CommonsMultipartResolver了。

两种MultipartResolver的配置详解

  • CommonsMultipartResolver的配置

    

        

        
    
        
        
        
    
  • StandardServletMultipartResolver
    StandardServletMultipartResolver 是Servlet 3.0 规范定义的上传解析器。在SpringMVC中使用时只需要在web.xml中给DispatcherServlet 增加一段multipart-config配置即可
spring-mvc
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            classpath:configs/springmvc.xml
        
        
            
            /Users/***/Documents/upload_temp
            
            102
            
            105

            2
        
        
        1
    

特别说明一下,上面配置中max-file-size 和max-request-size 如果不配置file-size-threshold 是不生效的。因为file-size-threshold是上传文件开始写入location 指定的缓存目录的阈值。经过测只有设定了file-size-threshold 时max-file-size 和max-request-size的设置才生效,否则没有效果。

你可能感兴趣的:(SpringMVC 上传文件两个解析器配置和区别)