错误原因

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); 处打断点,复制filepath 的值找到该文件并将其删除;放开断点,错误重现;

解决方案

方案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错误相关推荐

  1. Spring Boot上传文件报UT005023 MultipartException NoSuchFileException

    1.抛出问题: Spring Boot上传文件报: UT005023: Exception handling request to /management/certificateAuthority/u ...

  2. spring boot上传阿里云对象存储OSS快速上手(一、控制台简介)

    代码实现请看下一篇: spring boot上传阿里云对象存储OSS快速上手(二.代码实现,复制粘贴可用) 简介: 1.阿里云对象存储OSS其实就是一个文件存储的服务 2.在我们的开发过程中会遇到类似 ...

  3. Linux下scp无密码上传 下载 文件 目录的方法

    这篇文章主要介绍了Linux下scp无密码上传 下载 文件 目录的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在Linux下远程备份的时候,需要配置scp的 无密码复制文件.目录.就把这个 ...

  4. Spring Boot 上传文件(spring boot upload file)

    本篇文章将说明在Spring Boot web程序中如何上传文件. 开发环境: 1. eclipse Oxygen Release (4.7.0) 2. Spring Boot 1.4.3 RELEA ...

  5. Spring Boot(十七):使用Spring Boot上传文件

    Spring Boot(十七):使用Spring Boot上传文件 环境:Spring Boot最新版本1.5.9.jdk使用1.8.tomcat8.0 一.pom包配置 <parent> ...

  6. (转)Spring Boot(十七):使用 Spring Boot 上传文件

    http://www.ityouknow.com/springboot/2018/01/12/spring-boot-upload-file.html 上传文件是互联网中常常应用的场景之一,最典型的情 ...

  7. springboot上传文件同时传参数_Spring Boot 系列:使用 Spring Boot 上传文件

    上传文件是互联网中常常应用的场景之一,最典型的情况就是上传头像等,今天就带着带着大家做一个 Spring Boot 上传文件的小案例. 1.pom 包配置 我们使用 Spring Boot 版本 2. ...

  8. Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器)

    Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器) 主要思路 上传图片的思路有两种: 第一种是上传到应用服务器,再由应用服务器上传到OSS.这种适合上传的文件较小,较为简单, ...

  9. Linux下向GitHub 上传代码

    Linux下向GitHub 上传代码 1.先在Github个人主页创建一个仓库 2.在根目录下,复制仓库链接,将仓库复制到本地 git clone https://gitclone.com/githu ...

  10. Spring boot 上传文件时 MultipartFile 报空指针

    //直接上代码,这是一开始写的一个简单的 单文件上传 然后死活不好用 一直报500 走了断点跟了一下 看到multipartFile 是个null 有点疑惑 SimpleDateFormat sdf ...

最新文章

  1. 最大连续子序列和-动态规划
  2. 异常 Cannot resolve class or package
  3. simulink仿真实例_MATLAB机器人运动学仿真入门
  4. 认知实习培训第四天总结
  5. 【大会】网络性能、安全与成本之困
  6. java 上下文加载器_【深入理解Java虚拟机 】线程的上下文类加载器
  7. 拖放获取文件信息的bat代码
  8. 神秘的中国超级计算机:比肩高铁的世界级领先
  9. 妈妈再也不用担心孩子偷玩手机了!微信升级“青少年模式”
  10. python实现邮件客户端_python socket实现web服务器,邮件客户端
  11. SAP-物料 X 未对销售组织 XXXX 分销渠道 X 语言 XX 定义
  12. java走迷宫课程设计_java课程设计走迷宫.doc
  13. 常用Alink协议总结
  14. linux bt 命令行,在Linux终端下进行BT下载
  15. vba 判断文本框内容是否为空_VBA代码用SetFocus精确控制焦点事件
  16. S2B2C模式主要关注什么
  17. vue-cli使用ESLint记录
  18. python md5加密和统一社会信用代码_统一社会信用代码校验位python实现
  19. GNSS的基础知识 (GPS定位原理和组成)(1)
  20. 【深度学习入门】——亲手实现图像卷积操作

热门文章

  1. 编译项目时报出已经定义了构造器
  2. Sutton and Barto 教材中多臂老虎机(k-armed bandit testbed)模拟
  3. 客户想要 VS 客户预算
  4. LSD-slam算法原理
  5. 64位:浪来滔滔江水永不休
  6. 城市规划设计毕业论文范文
  7. js对象嵌套数组_使用角管过滤嵌套数组和对象的数组并突出显示结果
  8. monkey命令——压力测试——转载参考01
  9. 手机找不到大话西游新开服务器,大话西游手游新区冲级具体步骤
  10. 【论文笔记】Graph U-Nets