You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot2.3+Tomcat9文件上传临时文件异常问题咨询

问题背景与现象

我们使用Spring Boot 2.3开发了一个简单的Web应用,提供REST接口支持文件上传,接口签名如下:

@PostMapping(value = "/fileVerification", produces = "application/json;charset=UTF-8")
public String fileVerification(@RequestParam("file") MultipartFile file) {
      ...
}

应用部署在独立Apache Tomcat 9.0中(未使用Spring Boot内置Tomcat),采用的Multipart配置如下:

spring.servlet.multipart.enabled=true
spring.servlet.multipart.file-size-threshold=2KB
spring.servlet.multipart.max-file-size=-1
spring.servlet.multipart.max-request-size=-1

遇到以下三个问题:

  • 上传大于2KB的文件时,文件会被存储到java.io.tmp目录,但触发REST接口后打远程调试断点查看,临时文件是空的,不符合预期
  • java.io.tmp目录下生成空的crl和out目录,不清楚其用途
  • 预期临时文件会被自动删除,但实际只是被清空,直到服务器重启才会被删除

问题解答

1. 临时文件为空的原因

这是Tomcat处理Multipart请求的机制导致的:当请求进入Servlet容器时,Tomcat会先创建临时文件,但在请求数据未完全接收完成前,文件内容不会写入磁盘——直到请求流被完整读取,临时文件才会填充内容。你在接口刚触发时打断点,此时Tomcat还在接收请求数据,临时文件自然是空的。

另外,Spring Boot的MultipartFile封装了Tomcat的Part对象,如果代码中没有调用file.getInputStream()或file.transferTo()等方法读取文件内容,Tomcat可能不会将完整内容写入临时文件,也会导致临时文件为空。

2. crl和out目录的用途

这两个目录是Tomcat内部处理SSL/TLS连接时生成的临时目录:

  • crl:用于存储证书吊销列表(Certificate Revocation List)的临时文件,当Tomcat配置了SSL且启用CRL检查时会生成,无相关配置或CRL数据时目录为空
  • out:是Tomcat处理SSL输出缓存的临时目录,用于SSL握手过程中的临时数据存储,无活跃SSL连接时目录为空

这两个目录属于Tomcat内部临时资源,无需手动干预。

3. 临时文件未被删除的原因

Tomcat对Multipart临时文件的清理逻辑如下:

  • 默认情况下,Tomcat会在请求处理完成后尝试删除临时文件,但如果代码中持有文件输入流的引用(比如未关闭InputStream),或者MultipartFile对象未被正确销毁,会导致文件句柄被占用,Tomcat无法删除文件,只能先清空内容。
  • 此外,Tomcat的FileCleaner线程会定期清理过期临时文件,但如果文件被标记为“正在使用”,就会跳过删除,直到服务器重启时进程释放文件句柄,才会被系统清理。

可以检查代码中是否有未关闭的流,或手动调用file.getResource().getFile().deleteOnExit()确保文件在JVM退出时被删除,也可配置Tomcat的maxSwallowSize参数避免请求未完全处理时的资源残留。

内容的提问来源于stack exchange,提问作者Georg Strasser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 16:18:17