作者:龚清  历史版本:1  更新时间:2024-05-13 18:33

编写版本:v3.5.3
适用版本:v3.5.1+

文件上传时临时文件被清理导致NoSuchFileException异常问题

1、问题描述

通过spring boot MultipartFile上传文件时,spring boot默认配置会在/tmp下创建undertow的目录,来存放中途临时上传的文件,当上传完成后将/tmp中的文件清理,但在实际工作中,一台服务器的/tmp往往很小,且一台服务器上搭载了很多应用就很容易出现磁盘空间不足的情况

2、原因

undertow服务会自动在/tmp下载创建一个临时文件夹,用于文件上传。当对于linux而言/tmp目录时一个临时目录,很多应用程序的临时运行目录都可能使用到/tmp,一台服务器的/tmp磁盘空间有限,当满了以后spring就会报IOException: No space left on device的异常。linux会自动清理10天前的/tmp下目录文件(不同操作系统默认配置可以不一样),又或者被其他用户清理了,就会造成上面NoSuchFileException文件夹找不到的错误。

3、解决方案

补充spirng boot配置属性

#自行配置一个不被系统自动清理的目录
#目录不会自动创建,要配置已存在的目录
spring.servlet.multipart.location=/data/tmp

通过上述两项配置可以实现spring boot 使用undertow容器上传文件时将/tmp/undertow* 的临时目录切换至指定的目录下的效果。但是,依然会在/tmp目录创建一个4k大小的undertow的目录,不过上传时产生的临时目录不会再存放到/tmp/undertow 下了(可以在上传文件时实时观察/tmp/undertow* 和/data/tmp的目录大小判断,上传途中/tmp/undertow* 目录无任何变化,而/data/tmp 目录一直在变大,当上传完成后 /data/tmp大小恢复至0,说明被清理了.