如果同时使用了MultipartResolver 和ServletFileUpload,就会在iter.hasNext()返回false.然后整个循环就跳出去了。
整个问题产生的原因是Spring框架先调用了MultipartResolver 来处理http multi-part的请求。这里http multipart的请求已经消耗掉。后面又交给ServletFileUpload ,那么ServletFileUpload 就获取不到相应的multi-part请求。
下面就来介绍下然后解决它:
package
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
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);
}
}
然后在springContext配置文件中加入
<bean id="multipartResolver" class="com.mz3co.cnscecms.admin.utils.MyMultipartResolver">
<property name="excludeUrls" value="uploadFile.do"/>
<!-- url中带有example的http请求就不会被multipartResolver先解析-->
</bean>
value里的值是你上传文件所调用的url。
ps 要把之前配置的multipartResolver给去掉。
这样就可以避免其冲突并且获取到上传文件的数据。