今天又遇到一个奇怪的问题,明确记得原来配置有效的参数现在无效了,因为原来加这个参数就是为了解决默认配置造成的问题,所以确定原来是生效的,这个参数就是:

spring:
  http:
    multipart:
      maxFileSize: 50Mb  
      maxRequestSize: 100Mb

上网查了一下,有说不同spring boot版本配置不同的,有说配置参数单位配错的。

针对这两种说法都做了对比和测试,最终排除了这两种原因,没办法只好采用不快捷但最有效的方式去解决问题-DEBUG。

1、首先找到文件上传大小对应的配置类javax.servlet.MultipartConfigElement,在这个类的maxFileSize的setter中添加端点开始debug;

2、debug的时候会发现这里的值是由org.springframework.boot.web.servlet.MultipartConfigFactory类进行赋值的:

/**
 * Create a new {@link MultipartConfigElement} instance.
 * @return the multipart config element
 */
public MultipartConfigElement createMultipartConfig() {
   return new MultipartConfigElement(this.location, this.maxFileSize,
         this.maxRequestSize, this.fileSizeThreshold);
}

3、很奇怪的是在这里发现值是-1而不是配置的实际值,就在毫无头绪的时候突然发现这里的location的值比较奇怪,很明显不是默认配置也不是在配置文件配置的,一定是在什么地方赋值了的,那么接下来就是找出这个值是在哪里赋值的;

4、直接在代码中搜索前边发现的值,终于找到了对应的出处(代码如下),不知是出于什么需求有人设置了文件上传默认的目录并手工实例化了MultipartConfigElement:

    /**
     * 文件上传临时路径
     */
    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        String location = System.getProperty("user.dir") + CertificateConstant.TEMP_PATH;
        TEMP_FILE_PATH = location;
        File tmpFile = new File(location);
        if (!tmpFile.exists()) {
            if (!tmpFile.mkdirs()) {
                log.warn("create template file path error");
            }
        }
        factory.setLocation(location);
        return factory.createMultipartConfig();
    }

5、至此解决问题的办法就出来了,一种是在这里设置文件上传的大小限制,一种是去掉这段手工实例化的代码,由于这里只是设置了文件上传默认的临时目录,并且系统中与文件上传相关的功能点只有2、3个,为了避免以后的同事再踩到相同的坑里,我选择了删除这段代码,将配置交还给spring。

至此问题解决。

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐