springMvc 完美解决 multipart/form-data 方式提交请求 在 Filter 中 ServletRequest.getParameter方法 获取不到参数的问题
2016-10-27 11:04
1906 查看
问题:
继承上一篇使用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
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
p:defaultEncoding="UTF-8">
<property name="maxUploadSize">
<value>104857600</value>
</property>
<property name="maxInMemorySize">
<value>4096</value>
</property>
</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
// 用于创建MultipartHttpServletRequest
private MultipartResolver multipartResolver = null;
@Override
public void init(FilterConfig arg0) throws ServletException {
// 注入bean
ServletContext context = arg0.getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
multipartResolver = (MultipartResolver) ctx.getBean("multipartResolver");
}
2.3 在你的最顶层的 拦截器filter中 把你的 ServletRequest 替换成 MultipartHttpServletRequest
[java] view
plain copy
/**
* 获取 request
* @param req
* @return
*/
private ServletRequest getRequest(ServletRequest req){
String enctype = req.getContentType();
if (StringUtils.isNotBlank(enctype) && enctype.contains("multipart/form-data"))
// 返回 MultipartHttpServletRequest 用于获取 multipart/form-data 方式提交的请求中 上传的参数
return multipartResolver.resolveMultipart((HttpServletRequest) req);
else
return req;
}
2.4 把 用上面 2.3的 getRequest(req) 获取到的 MultipartHttpServletRequest 交给 chain.doFilter(MultipartHttpServletRequest, resp); 让请求继续执行。 之后的所有拦截器和controller都能继续get参数了
继承上一篇使用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
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
p:defaultEncoding="UTF-8">
<property name="maxUploadSize">
<value>104857600</value>
</property>
<property name="maxInMemorySize">
<value>4096</value>
</property>
</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
// 用于创建MultipartHttpServletRequest
private MultipartResolver multipartResolver = null;
@Override
public void init(FilterConfig arg0) throws ServletException {
// 注入bean
ServletContext context = arg0.getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
multipartResolver = (MultipartResolver) ctx.getBean("multipartResolver");
}
2.3 在你的最顶层的 拦截器filter中 把你的 ServletRequest 替换成 MultipartHttpServletRequest
[java] view
plain copy
/**
* 获取 request
* @param req
* @return
*/
private ServletRequest getRequest(ServletRequest req){
String enctype = req.getContentType();
if (StringUtils.isNotBlank(enctype) && enctype.contains("multipart/form-data"))
// 返回 MultipartHttpServletRequest 用于获取 multipart/form-data 方式提交的请求中 上传的参数
return multipartResolver.resolveMultipart((HttpServletRequest) req);
else
return req;
}
2.4 把 用上面 2.3的 getRequest(req) 获取到的 MultipartHttpServletRequest 交给 chain.doFilter(MultipartHttpServletRequest, resp); 让请求继续执行。 之后的所有拦截器和controller都能继续get参数了
相关文章推荐
- springMvc 完美解决 multipart/form-data 方式提交请求 在 Filter 中 ServletRequest.getParameter方法 获取不到参数的问题
- springMvc 完美解决 multipart/form-data 方式提交请求 在 Filter 中 ServletRequest.getParameter方法 获取不到参数的问题
- 过滤器中处理multipart/form-data头部的post请求request.getParameter(")获取不到参数问题
- 解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法
- 解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法
- 解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法
- 解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法
- 解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法
- 解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法
- 解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法 ?
- json传递中文乱码解决方法以及解决request.getParameter()获取参数为乱码的问题
- AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
- AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
- AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
- AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
- AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
- AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
- [转]AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
- AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
- struts中post方式上传文件,enctype="multipart/form-data",request.getParameter("file") 是null的问题分析