0%

Spring的multipartResolver和java后端获取的MultipartHttpServletRequest方法对比

问题描述

首先先给A组提供了上传接口,并没有在spring的配置文件进行multipartResolver的配置,后台Controller的java的获取为:

1
2
3
4
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
MultipartFile file = multipartRequest.getFile("file");
String a1 = multipartRequest.getParameter("a1");

将request请求的上下文转换为MultipartResolver,然后转换为MultipartHttpServletRequest请求,通过multi请求就可以获取对应的file文件信息,这样的方法没有问题,后台能获取到相应的参数;

稍后组里另一个同事也用到上传,基于网上查的资料,认为应该把配置文件给加上去了,于是问题出来了,也造成了我记录该博客的原因:

1
2
3
4
5
6
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设定默认编码 -->
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 设定文件上传的最大值5MB,5*1024*1024 -->
<property name="maxUploadSize" value="20971520"></property>
</bean>

进行该配置后,我在后台的该方法获取file为空造成了上传错误

解决方案

在spring-config配置了<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 之后,后台的获取有两种方法:

  1. 指定@RequestParam MultipartFile file 例如:public Map<String, Object> logsUpload(@RequestParam MultipartFile file,@RequestParam(value="key") String key) 参数;

  2. 将request转化为MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)(request);

原理

使用spring的CommosMultipartResolver 配置MultipartResolver 用于文件上传,DispatcherServlet 将调用 MultipartResolver 的 isMultipart(request) 方法检查当前 Web 请求是否为 multipart类型。如果是,DispatcherServlet 将调用 MultipartResolver 的 resolveMultipart(request) 方法,对原始 request 进行装饰,并返回一个 MultipartHttpServletRequest 供后继处理流程使用(最初的 HttpServletRequest 被偷梁换柱成了 MultipartHttpServletRequest),否则,直接返回最初的 HttpServletRequest。