跳至主要內容

6. MultipartFilter

安图新小于 1 分钟

6. MultipartFilter

前言

MultipartFilter 是以 filter 的方式对文件上传请求进行解析,将请求转换成 MultipartHttpServletRequest,在请求到达 DispatcherServlet 后,就能使用解析好的请求。

一、MultipartFilter 源码

(1)doFilterInternal( )

@Override
	protected void doFilterInternal(
			HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {


		//获取文件上传解析器
		MultipartResolver multipartResolver = lookupMultipartResolver(request);

		HttpServletRequest processedRequest = request;
		//检验isMultipart
		if (multipartResolver.isMultipart(processedRequest)) {


			if (logger.isDebugEnabled()) {


				logger.debug("Resolving multipart request [" + processedRequest.getRequestURI() +
						"] with MultipartFilter");
			}
			//解析上传文件信息,转换成文件上传请求MultipartHttpServletRequest
			processedRequest = multipartResolver.resolveMultipart(processedRequest);
		}
		else {


			// A regular request...
			if (logger.isDebugEnabled()) {


				logger.debug("Request [" + processedRequest.getRequestURI() + "] is not a multipart request");
			}
		}

		try {


			//执行下一个过滤器
			filterChain.doFilter(processedRequest, response);
		}
		finally {


			if (processedRequest instanceof MultipartHttpServletRequest) {


				//清理上传文件
				multipartResolver.cleanupMultipart((MultipartHttpServletRequest) processedRequest);
			}
		}
	}

(2)

	protected MultipartResolver lookupMultipartResolver(HttpServletRequest request) {


		return lookupMultipartResolver();
	}

	protected MultipartResolver lookupMultipartResolver() {


		WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
		//查找spring容器中名字为的filterMultipartResolverbean
		String beanName = getMultipartResolverBeanName();
		if (wac != null && wac.containsBean(beanName)) {


			if (logger.isDebugEnabled()) {


				logger.debug("Using MultipartResolver '" + beanName + "' for MultipartFilter");
			}
			return wac.getBean(beanName, MultipartResolver.class);
		}
		else {


			//返回默认的StandardServletMultipartResolver
			return this.defaultMultipartResolver;
		}
	}

二、 MultipartFilter 注册

@Configuration
public class FilterConfiguration {



    @Bean
    public FilterRegistrationBean filterTestRegistrationBean(){


        FilterRegistrationBean filterRegistry = new FilterRegistrationBean();
        filterRegistry.setOrder(Ordered.HIGHEST_PRECEDENCE + 3);
        //注册过滤器
        filterRegistry.setFilter(new MultipartFilter());
        filterRegistry.addUrlPatterns("/*");
        filterRegistry.setName("multipartFilter");
        return filterRegistry;
    }

}

这样,请求到达时,会先经过 filter 的处理文件上传的请求。