Spring MultipartResolver 或者 ServletFileUpload 冲突导致获取不到http数据/Multipart数据为空
2013-05-22 21:10
477 查看
如果不知道MultipartResolver 或者ServletFileUpload 的,请点击这里
如果同时使用了MultipartResolver 和ServletFileUpload,就会在iter.hasNext()返回false.然后整个循环就跳出去了。
if (isMultipart) {
DiskFileItemFactory factory = new DiskFileItemFactory(1024 * 1024 * 20, null);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
upload.setSizeMax(1024 * 1024 * 20);
List<FileItem> fileItems = upload.parseRequest(req);
Iterator<FileItem> iter = fileItems.iterator();
如果帐前 卒想快速解决这个问题。解决方法是加入帐前卒的multipartResolver,来单独处理某些请求。这些请求需要特判。例如下面的代码:
package example;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
/**
* @author 帐前卒
*/
public class MyMultipartResolver extends CommonsMultipartResolver {
private String excludeUrls;
private String[] excludeUrlArray;
public String getExcludeUrls() {
return excludeUrls;
}
public void setExcludeUrls(String excludeUrls) {
this.excludeUrls = excludeUrls;
this.excludeUrlArray = excludeUrls.split(",");
}
/**
* 这里是处理Multipart http的方法。如果这个返回值为true,那么Multipart http body就会MyMultipartResolver 消耗掉.如果这里返回false
* 那么就会交给后面的自己写的处理函数处理例如刚才ServletFileUpload 所在的函数
* @see org.springframework.web.multipart.commons.CommonsMultipartResolver#isMultipart(javax.servlet.http.HttpServletRequest)
*/
@Override
public boolean isMultipart(HttpServletRequest request) {
for (String url: excludeUrlArray) {
然后在web.xml中这样写:
<bean id="multipartResolver" class="example.MyMultipartResolver">
<property name="excludeUrls" value="example"/>
<!-- url中带有example的http请求就不会被multipartResolver先解析-->
</bean>
如果同时使用了MultipartResolver 和ServletFileUpload,就会在iter.hasNext()返回false.然后整个循环就跳出去了。
if (isMultipart) {
DiskFileItemFactory factory = new DiskFileItemFactory(1024 * 1024 * 20, null);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
upload.setSizeMax(1024 * 1024 * 20);
List<FileItem> fileItems = upload.parseRequest(req);
Iterator<FileItem> iter = fileItems.iterator();
// 这里获取不到任何FileItem while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { String name = item.getFieldName(); String value = item.getString("UTF-8"); request.put(name, value); } else { byte[] filebytes = item.get(); if (StringUtils.isBlank(item.getName())) { continue; } request.put(item.getFieldName(), new String(filebyte, "utf-8")); } } } }整个问题产生的原因是Spring框架先调用了MultipartResolver 来处理http multi-part的请求。这里http multipart的请求已经消耗掉。后面又交给ServletFileUpload ,那么ServletFileUpload 就获取不到相应的multi-part请求。
如果帐前 卒想快速解决这个问题。解决方法是加入帐前卒的multipartResolver,来单独处理某些请求。这些请求需要特判。例如下面的代码:
package example;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
/**
* @author 帐前卒
*/
public class MyMultipartResolver extends CommonsMultipartResolver {
private String excludeUrls;
private String[] excludeUrlArray;
public String getExcludeUrls() {
return excludeUrls;
}
public void setExcludeUrls(String excludeUrls) {
this.excludeUrls = excludeUrls;
this.excludeUrlArray = excludeUrls.split(",");
}
/**
* 这里是处理Multipart http的方法。如果这个返回值为true,那么Multipart http body就会MyMultipartResolver 消耗掉.如果这里返回false
* 那么就会交给后面的自己写的处理函数处理例如刚才ServletFileUpload 所在的函数
* @see org.springframework.web.multipart.commons.CommonsMultipartResolver#isMultipart(javax.servlet.http.HttpServletRequest)
*/
@Override
public boolean isMultipart(HttpServletRequest request) {
for (String url: excludeUrlArray) {
// 这里可以自己换判断 if (request.getRequestURI().contains(url)) { return false; } } return super.isMultipart(request); } }
然后在web.xml中这样写:
<bean id="multipartResolver" class="example.MyMultipartResolver">
<property name="excludeUrls" value="example"/>
<!-- url中带有example的http请求就不会被multipartResolver先解析-->
</bean>
相关文章推荐
- MultipartResolver 或者 ServletFileUpload 冲突导致获取不到http数据/Multipart数据为空
- Spring MultipartResolver 和ServletFileUpload 冲突导致获取不到上传文件的url
- JAVA Server上传文件 Spring MultipartResolver 或者 ServletFileUpload
- spring的multipartResolver和java后端获取的MultipartHttpServletRequest方法对比 (附:遇到的坑)
- 使用common-fileUpload和 Spring中MultipartHttpServletRequest实现文件上传
- jersey post提交到 ContainerRequestFilter 而HttpServletRequest获取不到数据(转)
- 【错误记录】HttpServletRequest.getParameter获取不到数据
- 关于Servlet中获取到Http传输过来的中文正常,而当数据插入到MySql中时为乱码或者问好的解决方案
- 在servlet中或者在filter中获取spring容器中的bean
- Spring中MultipartHttpServletRequest实现文件上传
- 总结! http post请求 application/x-www-form-urlencoded body体数据获取不到?
- 解决$GLOBALS["HTTP_RAW_POST_DATA"]获取不到数据的问题
- Nginx反向代理导致PHP获取不到正确的HTTP_HOST,SERVER_NAME,客户端IP的解决方法
- springMvc 完美解决 multipart/form-data 方式提交请求 在 Filter 中 ServletRequest.getParameter方法 获取不到参数的问题
- 使用 HttpURLConnection 获取不到网络数据
- springbootboot-HttpServletRequest.getInputStream() 获取post内容
- Spring中MultipartHttpServletRequest实现文件上传
- java Spring中配置获取HttpServletRequest的环境
- spring上传文件报错Expected MultipartHttpServletRequest: is a MultipartResolver configured?
- HttpWebResponse无法准确获取CharacterSet导致网页数据乱码问题的解决