错误提示:

临时文件目录被删除,导致文件上传报错,我们使用的是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的时候就会使用临时文件了,这也就是为啥临时目录被删除之后,我们上面会出现小文件可以成功上传,大文件上传报错的原因

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

所以根本原因在这里

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

被折叠的 条评论
为什么被折叠?



