spring boot 设置spring.http.multipart.maxFileSize无效问题解决办法

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

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。

至此问题解决。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EngineZhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值