今天线上遇到一个问题,编辑部分表单页面保存时报错,我随便点了点,发现有的页面ok有的页面不行,不行的页面都是带图片上传的,也就是form指定了enctype=“multipart/form-data”,想了一下,生产环境两周没迭代了,没人动啊,而且还有部分数据存在呢,也是测试过的不可能出有问题,然后看了下日志:
2018-11-14 13:36:53.202 [http-nio-8082-exec-10] ERROR o.a.c.c.C.[.[localhost].[/].[dispatcherServlet] -
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
[Request processing failed; nested exception is org.springframework.web.multipart.MultipartException:
Could not parse multipart servlet request; nested exception is java.io.IOException:
The temporary upload location [/tmp/tomcat.4519862041770988807.8082/work/Tomcat/localhost/ROOT]
is not valid] with root cause java.io.IOException: The temporary upload location [/tmp/tomcat.4519862041770988807.8082/work/Tomcat/localhost/ROOT] is not valid
大体看了下,从日志体现的就是有文件失效了,百度了一下查到原因了找到了,说是springboot打jar包通过java -jar启动的项目,如果上传文件会在linux的/temp/下生成一个tomcat*的文件夹,上传的文件先要转换成临时文件保存在这个文件夹下面。由于临时/tmp目录下的文件,在长时间(10天)没有使用的情况下,就会被系统机制自动删除掉。所以如果系统长时间无人问津的话,就可能导致上面这个问题。
解决办法:
- 临时的,直接重新启动项目就行,会重新建立临时文件夹
- 在配置文件中配置tomcat的临时目录:
server.tomcat.basedir=/home/temp
- 写个配置类,通过@Bean的方式配置目录:
/**
* 文件上传临时路径
*/
@Bean
MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setLocation("/home/temp");
return factory.createMultipartConfig();
}
实际上还是第二种更简单,测试环境用第一种重启下拉到,生产环境用特殊紧急情况用了第一种的话,得尽快迭代(10天内),免得又给删了出毛病