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
相关产品推荐
相关产品推荐

