1、背景描述

搭建的文件服务器,过一段时间后再上传文件会报错,上传文件前端报跨域问题,重启一下服务就又好了,一直没管它每次出现问题就重启。今天又报错了,开始查找原因,用Postman调试了一下上传接口,结果报的是500错误,这一看问题就大了不是前端报的跨区问题,看了一下日志报如下错误。

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

二、异常分析

从上述报错信息来看,翻译过来内容是指:临时上传位置无效。这个临时位置是哪里来的,为什么会有临时位置这一说法。

1、对于HTTP POST请求来说,它需要一个临时目录来存储POST数据。

2、因为该目录是放到temp文件夹下的一个临时目录,对于一些操作系统来讲,会经常删除临时内容的,所以这个内容就不存在了,导致上述报错信息说临时上传位置无效的结果。

up-3053c3c2f01954c29a2c56bf5aaa1ceeae5.png

三、解决方案

以下是汇总的几种解决办法,根据个人喜欢可用不同的方法。

方案一:重启本项目(临时解决)

我是懒省事儿,重启本项目,然后就解决这个问题了。

方案二:修改配置文件( application.properties 或 .yml 配置文件)

方式1: 改变tomcat 的基本工作目录所在位置,不放在tmp文件下;统一指定 server.tomcat.basedir=${user.home}/tomcat_upload (好处是:项目启动的时候会自动创建)

server.tomcat.basedir=${user.home}/tomcat_upload_temp 

方式2:适用于一些版本旧的项目,目前我知道的是spring boot 2.0.1以下版本

spring.http.multipart.location=${user.home}/data/tomcat_upload_temp

方式3:适用于一些新版本的项目,通常是spring boot 2.0.1以上的版本

spring.servlet.multipart.location=${user.home}/data/tomcat_upload_temp

注①:

采用方案二中:方式2、方式3时 如果指定的位置不存在 则需要手动去创建。当然你可以用java config 来实现(好处是:当配置的路径不存在时,可以自动的去创建它)

up-9fa906926d56c5335f34c78f804e2b26fba.png

注②:

如果尝试上面三种方式无效,没有正确的创建文件夹。那就得检查一下自己的配置类,看是否有自己的实现,有自己的Tomcat相关配置,如果有自己的配置类在yml下添加就无效了,在自己配置类中补充相关配置即可。

方案三:添加项目启动参数

-java.tmp.dir= ${user.home}/data/tomcat_upload_temp

参考:

https://blog.csdn.net/kellypipe/article/details/104535076 

https://blog.csdn.net/weixin_44299027/article/details/107100903 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐