The temporary upload location is not valid

现象

运营人员报警无法上传图片,并提供了错误截图(如下),从报错信息看来是服务器保存上传文件的临时文件夹不存在了。

org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.2737591724424319502.8080/work/Tomcat/localhost/ROOT] is not valid

错误截图

临时解决方案

登录到服务器上查看,的确没有该文件夹。为了尽快恢复功能以减少对运营的影响,手动新建了该目录。让运营人员在试一下,确认在运营人员的角度上,问题修复。

mkdir -p /tmp/tomcat.xxx/work/Tomcat/localhost/ROOT

但是这不是开发人员角度上的修复,解决一个问题,至少要知道原因,并防范再出现同样的问题。

分析问题

  • 前端Ajax上传一张图片,服务端将文件流临时保存在文件夹里(这个文件夹由spring boot在启动的时候新建)。
  • /tmp文件夹的有自动cleanup机制,/tmp文件夹的文件10天未更新会被移除,/var/tmp文件夹的文件是30天。

tmpwatch

问题产生的原因:有上面两点,问题已经就明确了。因为端午节的小长假以及图片上传是低频操作,导致了上文中的临时文件夹约10天没有更新了,文件夹被cleanup了。

解决方案

方案的思路是指定目录,将防止文件夹被自动删除。

1
2
3
4
5
6
@Bean
MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setLocation("/data/tmp");
return factory.createMultipartConfig();
}

参考

作者: wuzhaoyang(John)
出处: http://wuzhaoyang.me/
因为作者水平有限,无法保证每句话都是对的,但能保证不复制粘贴,每句话经过推敲。希望能表达自己对于技术的态度,做一名优秀的软件工程师。