java临时目录找不到问题分析及解决过程
作者:骑猪少年
java临时目录找不到问题解决
报错示例
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
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipart
HttpServletRequest.java:112) org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.
报错原因
java项目启动时,会在系统中创建一个临时目录,
- 在windows中为
C:\Users\用户名\AppData\Local\Temp\
- 在linux中为
/tmp
此目录,在未使用10天后将被系统删除(如10天内没有任何文件上传)
文件上传过程中,所有文件会临时保存在此目录中,当需要处理时会从此目录中读取
若此文件夹或文件不存在会报以上错误,一般将项目关闭重新启动即可解决,但是只是临时解决,在此给出两个解决方案:
注意:两方案二选一,全部选择有可能导致系统无法启动
方案一:
一般用于接触不到服务器或对linux命令不熟悉的开发者
首先在yml配置文件中添加multipart.location目录地址:
spring:
servlet:
multipart:
# 指定自定义上传目录
location: /mnt/tmp
然后添加config配置文件:
@Configuration
public class MultipartConfig {
@Value("${spring.servlet.multipart.location}")
private String fileTempDir;
@Bean
MultipartConfigElement multipartConfigElement() {
String os = System.getProperty("os.name");
// 兼容windows
if(os.toLowerCase().startsWith("win")){
fileTempDir = "C:" + fileTempDir;
}
log.info("fileTempDir:{}", fileTempDir);
MultipartConfigFactory factory = new MultipartConfigFactory();
File tmpDirFile = new File(fileTempDir);
// 判断文件夹是否存在
if (!tmpDirFile.exists()) {
//创建文件夹
boolean mkdirSuccess = tmpDirFile.mkdirs();
log.info("create temp dir,result:{}", mkdirSuccess);
}
factory.setLocation(fileTempDir);
return factory.createMultipartConfig();
}
}
配置测试:
在项目启动日志中寻找:
com.xx.config.MultipartConfig - fileTempDir:C:/mnt/tmp
代表配置成功
方案二:
在项目启动脚本或启动命令中加入以下命令
-Djava.io.tmpdir=/mnt/temp
总结
1.切记两方案选其一
2.以上方案实行后,可查看设定的目录是否自动创建成功,若目录找不到或不存在,可详细检查配置信息,确保项目信息无误可手动创建目录
3.两者原理相同,都是配置了文件的临时存储目录,此目录和其他系统目录一致,属于用户自己控制,不会因特殊原因被系统删除,此乃长久之计
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
