Linux下 Spring Boot 上传找不到临时目录, 出现500错误
错误原因
在 Linux
系统中,Spring Boot
应用以 java -jar
命令启动时,会在操作系统的 /tmp
目录下生成一个 tomcat
(或 undertow
)临时目录,上传的文件先要转换成临时文件保存在这个文件夹下面。由于临时 /tmp
目录下的文件,在长时间(10天)没有使用的情况下,系统执行了 tmp
目录清理服务(systemd-tmpfiles-clean.service
),导致 /tmp/undertow...8090
文件被清理,然而在上传的时候,undertow
服务器需要创建/tmp/undertow...8090/undertow...upload
临时文件,但是调用 Files.createFile(...)
的时候就会发现找不到父目录,才导致了以上的错误。
具体错误日志(参考)
undertow
java.nio.file.NoSuchFileException: /tmp/undertow.17753558642503713859.8085/undertow7370242804103803588upload
Tomcat
The temporary upload location [/tmp/tomcat.7957874575370093230.8088/work/Tomcat/localhost/ROOT] is not valid
重现方法
找到类 io.undertow.server.handlers.form.MultiPartParserDefinition
定位到如下代码
@Override
public void beginPart(final HeaderMap headers) {this.currentFileSize = 0;this.headers = headers;final String disposition = headers.getFirst(Headers.CONTENT_DISPOSITION);if (disposition != null) {if (disposition.startsWith("form-data")) {currentName = Headers.extractQuotedValueFromHeader(disposition, "name");fileName = Headers.extractQuotedValueFromHeaderWithEncoding(disposition, "filename");if (fileName != null && fileSizeThreshold == 0) {try {if (tempFileLocation != null) {file = Files.createTempFile(tempFileLocation, "undertow", "upload");} else {file = Files.createTempFile("undertow", "upload");}createdFiles.add(file);fileChannel = FileChannel.open(file, StandardOpenOption.READ, StandardOpenOption.WRITE);} catch (IOException e) {throw new RuntimeException(e);}}}}
}
在 createdFiles.add(file);
处打断点,复制file
的 path
的值找到该文件并将其删除;放开断点,错误重现;
解决方案
方案1 (推荐)
在
applicaiton.yml(applicaiton.property)
中添加配置 :spring.servlet.multipart.location
spring.servlet.multipart.location
底层就是createMultipartConfig
中的factory.setLocation
,见源码:org.springframework.boot.autoconfigure.web.servlet.MultipartProperties#createMultipartConfig
spring:servlet:multipart:location: /data/tmp
手动指定目录后,必须保证该目录存在,并由读写的权限
创建该目录mkdir -p /data/tmp
方法二
使用配置类配置, 类似方案1
@Bean
public MultipartConfigElement multipartConfigElement() {MultipartConfigFactory factory = new MultipartConfigFactory();factory.setLocation(System.getProperty("/data/tmp"));return factory.createMultipartConfig();
}
方案三(不推荐)
手动创建临时目录
mkdir -p /tmp/undertow.17753558642503713859.8085/undertow7370242804103803588upload
方案四(不推荐)
修改系统配置,排除该临时目录
vim /usr/lib/tmpfiles.d/tmp.con
# 文件最后添加
x /tmp/undertow*
原文链接:IT浪子の博客 >Linux下 Spring Boot 上传找不到临时目录, 出现500错误
Linux下 Spring Boot 上传找不到临时目录, 出现500错误相关推荐
- Spring Boot上传文件报UT005023 MultipartException NoSuchFileException
1.抛出问题: Spring Boot上传文件报: UT005023: Exception handling request to /management/certificateAuthority/u ...
- spring boot上传阿里云对象存储OSS快速上手(一、控制台简介)
代码实现请看下一篇: spring boot上传阿里云对象存储OSS快速上手(二.代码实现,复制粘贴可用) 简介: 1.阿里云对象存储OSS其实就是一个文件存储的服务 2.在我们的开发过程中会遇到类似 ...
- Linux下scp无密码上传 下载 文件 目录的方法
这篇文章主要介绍了Linux下scp无密码上传 下载 文件 目录的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在Linux下远程备份的时候,需要配置scp的 无密码复制文件.目录.就把这个 ...
- Spring Boot 上传文件(spring boot upload file)
本篇文章将说明在Spring Boot web程序中如何上传文件. 开发环境: 1. eclipse Oxygen Release (4.7.0) 2. Spring Boot 1.4.3 RELEA ...
- Spring Boot(十七):使用Spring Boot上传文件
Spring Boot(十七):使用Spring Boot上传文件 环境:Spring Boot最新版本1.5.9.jdk使用1.8.tomcat8.0 一.pom包配置 <parent> ...
- (转)Spring Boot(十七):使用 Spring Boot 上传文件
http://www.ityouknow.com/springboot/2018/01/12/spring-boot-upload-file.html 上传文件是互联网中常常应用的场景之一,最典型的情 ...
- springboot上传文件同时传参数_Spring Boot 系列:使用 Spring Boot 上传文件
上传文件是互联网中常常应用的场景之一,最典型的情况就是上传头像等,今天就带着带着大家做一个 Spring Boot 上传文件的小案例. 1.pom 包配置 我们使用 Spring Boot 版本 2. ...
- Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器)
Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器) 主要思路 上传图片的思路有两种: 第一种是上传到应用服务器,再由应用服务器上传到OSS.这种适合上传的文件较小,较为简单, ...
- Linux下向GitHub 上传代码
Linux下向GitHub 上传代码 1.先在Github个人主页创建一个仓库 2.在根目录下,复制仓库链接,将仓库复制到本地 git clone https://gitclone.com/githu ...
- Spring boot 上传文件时 MultipartFile 报空指针
//直接上代码,这是一开始写的一个简单的 单文件上传 然后死活不好用 一直报500 走了断点跟了一下 看到multipartFile 是个null 有点疑惑 SimpleDateFormat sdf ...
最新文章
- 最大连续子序列和-动态规划
- 异常 Cannot resolve class or package
- simulink仿真实例_MATLAB机器人运动学仿真入门
- 认知实习培训第四天总结
- 【大会】网络性能、安全与成本之困
- java 上下文加载器_【深入理解Java虚拟机 】线程的上下文类加载器
- 拖放获取文件信息的bat代码
- 神秘的中国超级计算机:比肩高铁的世界级领先
- 妈妈再也不用担心孩子偷玩手机了!微信升级“青少年模式”
- python实现邮件客户端_python socket实现web服务器,邮件客户端
- SAP-物料 X 未对销售组织 XXXX 分销渠道 X 语言 XX 定义
- java走迷宫课程设计_java课程设计走迷宫.doc
- 常用Alink协议总结
- linux bt 命令行,在Linux终端下进行BT下载
- vba 判断文本框内容是否为空_VBA代码用SetFocus精确控制焦点事件
- S2B2C模式主要关注什么
- vue-cli使用ESLint记录
- python md5加密和统一社会信用代码_统一社会信用代码校验位python实现
- GNSS的基础知识 (GPS定位原理和组成)(1)
- 【深度学习入门】——亲手实现图像卷积操作