今天线上遇到一个问题,编辑部分表单页面保存时报错,我随便点了点,发现有的页面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天内),免得又给删了出毛病
本文分析了SpringBoot项目在Linux环境下,长时间未操作导致的文件上传失败问题。详细介绍了错误日志信息,解释了临时文件被系统自动清理的原因,并提供了两种解决方案:重启项目和配置自定义的临时文件目录。
1万+

被折叠的 条评论
为什么被折叠?



