最近生产环境发现一个问题,后台管理系统有一个上传文件保存数据库的功能,每隔一段时间就会出现上传失败,重启服务就可以正常上传。
分析问题:由于服务在启动时会在服务器的/tmp目录下生成tomcat.827296577384433988.8005(work/Tomcat/localhost/ROOT)和tomcat-docbase.546140289861349437.8005这样两个文件夹,对于Multipart(form-data)的方式处理请求时,默认就是在tomcat-docbase目录下创建临时文件的,而centos服务器会定期的清理/tmp这个目录,导致上传时找不到目录而报错上传失败。
解决问题:
方式一、修改服务器配置不删除tmp目录下的tomcat(不推荐)
- 在/usr/lib/tmpfiles.d/tmp.conf配置文件中增加如下代码
x /tmp/tomcat.* x /tmp/tomcat-docbase*
- 重启服务systemctl restart systemd-tmpfiles-clean
方式二、通过服务修改(2和3选一个即可)
- 在application.properties中增加server.tomcat.basedir=/app/xxxx/tmp配置
- 启动参数加-Djava.io.tmpdir=/app/xxx/tmp
- 在服务启动类中增加如下代码
@Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory multipartConfigFactory = new MultipartConfigFactory(); String location = System.getProperty("user.dir") + "/data/tmp"; File file = new File(location); if (!file.exists()) { file.mkdirs(); } multipartConfigFactory.setLocation(location); return multipartConfigFactory.createMultipartConfig(); }