项目场景:
一个springboot项目,项目中有个自动生成word文档的功能。部署到inux上。看了看系统用的是中标麒麟的系统。但是系统内核应该是基于linux的。本地测试生成word功能没问题,部署上去原本也没问题,后来突然就不能用了。但是本地启动了又没问题,所以到服务器上看了看报错信息。
问题描述
报错信息:
每次调用生成文件功能都会有这个报错(某些项目里上传下载可能也会出这个报错)
org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1146908504104468874.9007/work/Tomcat/localhost/tt] is not valid
原因分析:
从报错我们能看出,应该是/tmp/tomcat.1146908504104468874.9007/work/Tomcat/localhost/tt
这个目录不存在导致的。这个目录是什么呢?
1.这个目录是一个tomcat的临时目录
2.springboot项目启动后会在tmp自动生成要用的临时目录
3.上传下载,或者涉及到一些文件操作的时候,springboot会用到这个目录
4.linux内核的操作系统,会清理tmp目录(不同的内核可能不同,有的是重启时候清理,有的是定时清理。总之就是这个文件会消失)。我用的系统是10天清理一次。所以才会出现,刚部署上去测试没问题,使用一段时间后出现问题的情况。就是因为tomcat的临时文件目录被清理了,导致找不到目录报错
5./tmp目录的清理规则主要取决于/usr/lib/tmpfiles.d/tmp.conf文件的设定。大家可以去看自己的清理规则
我的文件里是这样的。
# Clear tmp directories separately, to make them easier to override
# 清理/tmp目录下10天前的目录和文件
v /tmp 1777 root root 10d
# 清理/var/tmp目录下30天前的目录和文件
v /var/tmp 1777 root root 30d
解决方案:
可以分3种方式解决
1.重启springboot。因为springboot重启的时候会重新去生成这个目录。咱们就有目录用了
2.先重启springboot,然后修改/usr/lib/tmpfiles.d/tmp.conf文件。
添加X /tmp/tomcat.*
,让系统不清除tomcat相关的目录(我用的这个,但是还需要观察一段时间看是否会出问题)
3.修改springboot配置文件,指定新的临时目录(这个我从网上抄的,没实践)新的上传目录需要手动创建,因为新指定的临时目录不是tmp,不会被清除,下面是我搜到的几个例子,yml文件要修改成对应的格式。
例子1:
application.properties 配置文件中添加spring.http.multipart.location=手动指定一个临时目录属性,注意:目录需要手动创建
例子2:
在配置文件application.properties中指定tomcat的临时路径:server.tomcat.basedir=/home/abc