由于在上一篇写ajax提交表单时,在springmvc.xml里配置了MultipartResolver,导致我引入的图片上传插件失效(上传显示成功,但是后台没有接收到),在利用各种搜索引擎查找问题之后,终于找到了原因。
文件上传有两种方式,spring框架里的MultipartResolver解析以及传统的ServletFileUpload。
由于我引入的图片上传插件是第二种方式,而上篇写到的ajax提交表单需要MultipartResolver解析,两种方式一起使用会产生冲突。传统方式上传文件的请求会被multipartResolver拦截,导致没有解析出文件。
由于我引入的插件代码稍微封装的有点麻烦,改起来肯定不方便,而另一边虽然可以改成传统方式发送表单数据,但是需要更多js代码来解析表单数据发送,所以我选择第二种方法。
事实证明第二种方法确实也更方便。
创建一个类MyMultipartResolver并让它继承MultipartResolver,下面代码贴出:
package com.me.resolver;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
public class MyMultipartResolver extends CommonsMultipartResolver {
//单url过滤以及多url过滤
private String excludeUrls;
private String[] excludeUrlArray;
public String getExcludeUrls() {
return excludeUrls;
}
//以逗号分隔
public void setExcludeUrls(String excludeUrls) {
this.excludeUrls=excludeUrls;
this.excludeUrlArray=excludeUrls.split(",");
}
//重写的方法,判断url是否需要multipartResolver解析
@Override
public boolean isMultipart(HttpServletRequest request) {
for(String url:excludeUrlArray) {
if(request.getRequestURI().contains(url)) {
return false;
}
}
return super.isMultipart(request);
}
}
关键在于isMultipart里的判断
接下来在springmvc.xml配置,删除之前MultipartResolver 的配置内容,修改为
<bean id="multipartResolver" class="com.me.resolver.MyMultipartResolver">
<property name="excludeUrls" value="update" />
<property name="defaultEncoding" value="UTF-8"></property>
<property name="maxUploadSize" value="2097152"></property>
<property name="maxInMemorySize" value="1024"></property>
</bean>
由此,两种方法就能和睦相处啦~