错误提示:
临时文件目录被删除,导致文件上传报错,我们使用的是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的时候就会使用临时文件了,这也就是为啥临时目录被删除之后,我们上面会出现小文件可以成功上传,大文件上传报错的原因
注释翻译 :
阈值,以字节为单位,低于该阈值,文件将保留在内存中,高于该阈值,它们将作为文件存储。
所以根本原因在这里