springboot上传文件临时文件夹找不到不能成功上传问题

本文分析了Spring Boot项目中文件上传失败的原因,主要涉及临时文件夹路径问题及磁盘空间不足情况,并提供了三种解决方案:配置文件指定路径、使用配置类设置及调整Java启动参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

错误信息1:org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1220970741172837513.8080/work/Tomcat/localhost/ROOT] is not valid at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:111)

错误信息2:Failed to parse multipart servlet request;
nested exception is java.lang.RuntimeException: java.nio.file.NoSuchFileException:
/tmp/undertow.3701241699676381582.32711/undertow1504003900571732622upload

原因分析:
        1、Tomcat在上传文件的时候,会先将文件上传至临时文件夹(默认情况下,tomcat 启动的时候会在 tmp 下 进行初始化临时文件夹,如果上传文件没有指定临时文件夹的位置,这个时候默认为Tomcat 的基本工作路径),由于Linux系统会定期对 tmp下的文件夹进行清除,当一旦这个目录被系统清除掉,在上传文件的时候就会导致找不到路径而报错。
注:Tomcat 在启动的时候根据 server.tomcat.basedir 指定的值(默认 tmp )下初始化 tomcat.xxxxx(上传文件临时路径);默认我们可以在tmp 下面看到很多这样的tomcat 开头的临时文件夹

         2、通过spring boot MultipartFile上传文件时,spring boot默认配置会在/tmp下创建undertow的目录,来存放中途临时上传的文件,当上传完成后将/tmp中的文件清理,但在实际工作中,一台服务器的/tmp往往很小,且一台服务器上搭载了很多应用就很容易出现磁盘空间不足的情况

Failed to parse multipart servlet request; nested exception is java.lang.RuntimeException: java.io.IOException: No space left on device

方案1:

在SpringBoot项目中,配置spring.http.multipart.location可以指定上传文件的临时路径。

但是,SpringBoot版本不同,关于这一块的配置也不相同。

1、Spring Boot 1.3 版本:

  multipart.location=/data/tmp

2、Spring Boot 1.4 版本和 1.5 版本:

  spring.http.multipart.location=/data/tmp

3、Spring Boot 2.0 版本:

  spring.servlet.multipart.location=/data/tmp

以上,要注意1.4、1.5版本和2.0版本的区别,不然会不起作用。

方案2:

使用配置类配置

public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    factory.setLocation(System.getProperty("/data/tmp"));
    return factory.createMultipartConfig();
}

方案3

在java启动命令中加入这个参数

-java.tmp.dir=/data/tmp

### 解析 Spring Boot上传图片后不到指定路径的问题 当遇到 `java.io.IOException` 或者 `FileNotFoundException` 错误提示,指出 Tomcat 临时文件夹下的路径无法到时,这通常是因为应用程序尝试读取或写入位于 Tomcat 临时工作目录中的资源。Tomcat 创建这些临时文件用于部署和运行期间存储数据,但在重启服务器或者关闭 IDE 后会被删除。 为了确保上传的图像能够被正确访问而不依赖于易失性的临时位置,在开发过程中应该考虑将文件保存至更持久的位置,并更新程序逻辑来指向新的存储地点[^1]。 一种推荐的做法是在项目的静态资源目录 (`src/main/resources/static`) 下创建专门用来存放用户上传内容的子文件夹。这样做的好处是可以利用 Spring Boot 默认提供的静态资源映射机制,使得前端可以直接通过 URL 访问到对应的文件而无需额外配置路由规则[^3]。 另外需要注意的是,如果使用了自定义的 MVC 配置类并启用了 `@EnableWebMvc` 注解,则可能会禁用掉一些默认设置,因此要确认是否影响到了静态资源加载行为。对于大多数场景来说,保持默认状态即可满足需求。 最后,针对生产环境而言,考虑到安全性以及性能优化等因素,最好采用专业的对象存储服务(如 AWS S3、阿里云 OSS 等)作为外部仓库来托管多媒体资料;而在本地测试阶段可以继续沿用上述方法进行调试[^4]。 ```yaml # application.yml 示例配置片段 spring: servlet: multipart: enabled: true # 开启多部分请求支持,默认已启用 max-file-size: 5MB # 单个文件最大尺寸限制 max-request-size: 20MB # 整个 HTTP 请求体的最大大小 server: port: 8080 # 设置端口号 ``` ```properties # application.properties 示例配置片段 spring.servlet.multipart.enabled=true # 开启多部分请求支持,默认已启用 spring.servlet.multipart.max-file-size=5MB # 单个文件最大尺寸限制 spring.servlet.multipart.max-request-size=20MB # 整个 HTTP 请求体的最大大小 server.port=8080 # 设置端口号 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值