springMvc 完美解决 multipart/form-data 方式提交请求 在 Filter 中 ServletRequest.getParameter方法 获取不到参数的问题

本文介绍了解决在使用contentType=multipart/form-data上传文件时,如何通过配置MultipartResolver及自定义过滤器来确保能够正确获取一并提交的表单参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

     继承上一篇使用contentType=multipart/form-data的header以文件流的的形式上传文件时,如果代码中使用了filter,会出现无法用Filter 中用 ServletRequest.getParameter 方法取不到一并提交上来的 参数,


通过查看mvc的源码 果然 发现了两个类,

1.1.实现了、 ServletRequest的 org.springframework.web.multipart.MultipartHttpServletRequest.Java 类 (这个类的 getParameter 方法可以获取到 multipart/form-data 和 非multipart/form-data 方法上传的  参数)

1.2.用于创建 MultipartHttpServletRequest.java 的 org.springframework.web.multipart.MultipartResolver.java 类

使用方法

2.1  首先在你的spring配置文件中 配置 MultipartHttpServletRequest

[html]  view plain  copy
  1. <bean id="multipartResolver"  
  2.         class="org.springframework.web.multipart.commons.CommonsMultipartResolver"  
  3.         p:defaultEncoding="UTF-8">  
  4.         <property name="maxUploadSize">  
  5.             <value>104857600</value>  
  6.         </property>  
  7.         <property name="maxInMemorySize">  
  8.             <value>4096</value>  
  9.         </property>  
  10. </bean>  

 注意:这个bean生成需放在application-context中,若放在dispatcher-servlet中,这个bean初始化不成功。因为首先 Servlet 的 bean 跟 application 的 bean 容器是两个分开的,Servlet 可以去找 application ,但反过来不行。而那个 interceptor 中需要有配置,配置管理器这个 bean 是在 application 中初始化的,所以你需要把这个 interceptor 也放在 application 中


2.2 在你的filter其中 注入 MultipartHttpServletRequest

[java]  view plain  copy
  1. // 用于创建MultipartHttpServletRequest  
  2. private MultipartResolver multipartResolver = null;  
  3.       
  4. @Override  
  5. public void init(FilterConfig arg0) throws ServletException {  
  6. // 注入bean  
  7. ServletContext context = arg0.getServletContext();
  8. ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
  9. multipartResolver = (MultipartResolver) ctx.getBean("multipartResolver");
  10.   
  11. }  


 

2.3 在你的最顶层的 拦截器filter中 把你的 ServletRequest 替换成 MultipartHttpServletRequest

[java]  view plain  copy
  1. /** 
  2.  * 获取 request 
  3.  * @param req 
  4.  * @return 
  5.  */  
  6. private ServletRequest getRequest(ServletRequest req){  
  7.     String enctype = req.getContentType();  
  8.     if (StringUtils.isNotBlank(enctype) && enctype.contains("multipart/form-data"))  
  9.         // 返回 MultipartHttpServletRequest 用于获取 multipart/form-data 方式提交的请求中 上传的参数  
  10.         return multipartResolver.resolveMultipart((HttpServletRequest) req);  
  11.     else   
  12.         return req;  
  13. }  


2.4 把 用上面 2.3的 getRequest(req) 获取到的 MultipartHttpServletRequest 交给 chain.doFilter(MultipartHttpServletRequest, resp); 让请求继续执行。 之后的所有拦截器和controller都能继续get参数了


在使用SpringMVC进行文件上传时,我们需要在表单中添加enctype="multipart/form-data"属性。这是因为默认情况下,表单的enctype属性是“application/x-www-form-urlencoded”,它只支持普通的键值对数据传输,无法支持文件上传。 通过设置enctype为"multipart/form-data",表单的提交方式变为多部分请求,这种方式可以支持文件上传。 除了在form表单中添加enctype属性,我们还需要在SpringMVC的配置文件中进行相关的配置。通常,我们使用SpringMVC的注解方式进行文件上传,首先需要在控制器方法参数中添加一个MultipartFile类型的参数,这个参数将接收上传的文件。 在进行文件上传时,需要在SpringMVC的配置文件中添加MultipartResolver解析器的配置。这个解析器负责解析多部分请求,从中提取文件信息。 在进行文件上传处理时,SpringMVC会将上传的文件保存到临时目录中。我们可以通过MultipartFile对象的方法获取文件的相关信息,如文件名、大小和内容等。 在文件上传完成后,可以根据业务需求将文件保存到指定的位置。可以使用File类的相关方法进行文件的操作,如保存、删除等。 总之,使用SpringMVC进行文件上传时,需要在form表单中添加enctype属性为"multipart/form-data",并在SpringMVC的配置文件中做相关的配置。之后,在控制器方法中添加MultipartFile类型的参数,通过该参数获取上传的文件信息,并进行相应的处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值