springboot内嵌tomcat文件上传路径不存在问题原因

6 篇文章 0 订阅
4 篇文章 0 订阅
文章详细解释了一种错误情况,即在Linux系统中,由于10天未使用的临时文件目录被删除,导致大文件上传时出错。问题的关键在于Tomcat使用DiskFileItemFactory,当文件大小超过sizeThreshold(默认10KB)时,文件会存储在磁盘上,因此需要自定义临时文件上传目录以解决此问题。小文件能成功上传是因为它们可能未超过内存存储阈值。
摘要由CSDN通过智能技术生成

错误提示:

 临时文件目录被删除,导致文件上传报错,我们使用的是linux系统,10天没有使用,就会被删除

代码: 

 

 

解决办法:

        配置文件中自定义临时文件上传目录

server:
  port: 9090
  tomcat:
    basedir: /crm/tmp

特殊情况:

        当我上传小文件的时候可以上传成功,大文件的时候上传失败

        猜测可能是小文件没有使用临时文件,大文件上传的时候才使用了临时文件,但是这个边界值是在那里控制的呢??

分析整个请求流程:

        tomcat接收到请求  ->  调用springmvc的DispacherServlet -> doDispatch方法里面回去处理文件

问题根本原因:

        这不是tomcat的问题, 而是我们去解析请求中的文件的时候出现的问题;

源码流程:

DispatchServlet.class

文件解析器去处理,

如果spring中没有注册该bean, 这里的multipartResolver对象就是null,就会直接返回request

就会调用到CommonsMultipartResolver.class的方法中来

这里就使用了fileUpload.parseRequest(request); 重点就在这里面

划重点了:

这里使用的是DiskFileItemFactory工厂

DiskFileItemFactory工厂 里面有个sizeThreshold,

this.sizeThreshold = 10240;

注释翻译成中文就是 :

默认阈值,超过该阈值上传内容将存储在磁盘上。

所以当文件超过10k的时候就会使用临时文件了,这也就是为啥临时目录被删除之后,我们上面会出现小文件可以成功上传,大文件上传报错的原因

注释翻译 :

阈值,以字节为单位,低于该阈值,文件将保留在内存中,高于该阈值,它们将作为文件存储。

所以根本原因在这里

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值