文件上传解析冲突问题

由于在上一篇写ajax提交表单时,在springmvc.xml里配置了MultipartResolver,导致我引入的图片上传插件失效(上传显示成功,但是后台没有接收到),在利用各种搜索引擎查找问题之后,终于找到了原因。


原因

文件上传有两种方式,spring框架里的MultipartResolver解析以及传统的ServletFileUpload
由于我引入的图片上传插件是第二种方式,而上篇写到的ajax提交表单需要MultipartResolver解析,两种方式一起使用会产生冲突。传统方式上传文件的请求会被multipartResolver拦截,导致没有解析出文件。


解决方案

  1. 统一使用同一种方式上传请求
  2. 继承MultipartResolver,并重写其中的方法,当遇到某些url请求的时候跳过

由于我引入的插件代码稍微封装的有点麻烦,改起来肯定不方便,而另一边虽然可以改成传统方式发送表单数据,但是需要更多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>
    

                由此,两种方法就能和睦相处啦~