Springboot入坑系列:文件上传失败,找不到.tmp临时文件-tmp是什么文件

背景介绍

本人前阵子接了部门的一个小需求,公司新成立一个子公司,有个门户网站需要java服务端支持一下,老大找打我,让我花两天时间搞定它。我找运营了解了下需求发现简单不能再简单,让我搞毕业大学生就饿能做的事,不爽(但是事还得做啊),了解到springboot近两年很火(ps:项目原因之前没用过springboot),于是打算用springboot来做。

花了一上午时间简单了解了下,别说搞个web项目是真快,遂一鼓作气一下午搞定了所有需求,加了个班自测也过了(有别的棘手的事要忙,所以不能在这耽搁时间),觉得还可以,于是直接写了文档给前端了。

没过多久,前端也完成,测试ok,上线了。

祸从天降

直到上周五,我被拉到一个wx群说文件上传异常了,卧槽lz一脸懵逼,不是测试ok了吗?神马情况,我当时的第一反应:shit,掉坑里了。于是我找运维小哥哥要了权限上去看了日志,报错日志大概长这样子:

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

认真看了下,还真不知道这说的啥玩意! 也不想多浪费时间,于是google,了解到原因大致如下:在linux系统中,springboot应用服务再启动(java -jar 命令启动服务)的时候,会在操作系统的/tmp目录下生成一个tomcat*的文件目录,上传的文件先要转换成临时文件保存在这个文件夹下面。由于临时/tmp目录下的文件,在长时间(10天)没有使用的情况下,就会被系统机制自动删除掉。所以如果系统长时间无人问津的话,就可能导致上面这个问题。

这下原因明白了,要我说这springboot也是有病,开发加测试也没到10天,10天内根本测不出来问题,可能这货有个好爸爸Spring吧。

既然出问题了,总要解决的,下面提供两种方法,亲测有效。

手动注入一个Bean,并配置临时目录

@Bean
MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setLocation("/app/xxx/uploadtmp");
return factory.createMultipartConfig();
}

而我则采用下面这种方式,方便快捷

yml配置临时目录

Springboot入坑系列:文件上传失败,找不到.tmp临时文件

yml配置文件上传临时目录

server:

port: 19990

context-path: /appName

tomcat:

basedir: /app/xxx/uploadtmp

以上两种方式配置后,都会在/app/xxx/uploadtmp目录下生成一堆文件,如下所示:

Springboot入坑系列:文件上传失败,找不到.tmp临时文件

总结

springboot是很方便开发,但还是有一些小缺陷的,想着以后会跟springboot多打交道,还是把使用springboot途中掉过的坑给罗列下来,希望大家能安全避开这些坑。

推荐阅读