Tomcat8.5.78上传超100KB文件失败:临时文件不存在错误求助
排查方向与调试建议
1. 确认Tomcat临时目录的实际使用路径
- 查看Tomcat启动日志,找到
Using CATALINA_TMPDIR: xxx的记录,确认Tomcat实际使用的临时目录;也可在上传代码中打印System.getProperty("java.io.tmpdir"),验证运行时临时目录是否符合预期。 - Linux/Mac的系统临时目录(如
/tmp)可能存在自动清理机制(比如systemd的tmpfiles.d规则、macOS的定时清理),大文件上传过程中临时文件可能未完成处理就被删除。建议临时修改Tomcat的临时目录为自定义路径:在catalina.sh中添加CATALINA_TMPDIR="/path/to/your/custom/tmp",重启Tomcat后测试。
2. 手动指定commons-fileupload的临时目录
- 不要依赖默认系统临时目录,在代码中显式设置commons-fileupload的临时文件存储路径:
DiskFileItemFactory factory = new DiskFileItemFactory(); File customTmpDir = new File("/path/to/custom/non-system-tmp"); factory.setRepository(customTmpDir); ServletFileUpload upload = new ServletFileUpload(factory); - 确保自定义目录的权限:Tomcat运行用户需拥有该目录的
rwx权限(Linux/Mac下执行chown tomcat:tomcat /path/to/custom/non-system-tmp && chmod 700 /path/to/custom/non-system-tmp)。
3. 检查Tomcat连接器的maxSwallowSize配置
- 该参数控制客户端提前断开连接时Tomcat允许"吞下"的剩余请求数据量,Tomcat8默认值为2MB,若设置过小可能导致大文件上传时临时文件被异常清理。在
server.xml的Connector节点中添加:<Connector ... maxSwallowSize="-1" /> - 注意此参数与
maxPostSize的区别:maxPostSize限制请求体总大小,maxSwallowSize处理客户端中断场景下的剩余数据。
4. 排查系统文件描述符限制
- Linux/Mac下Tomcat运行用户的文件描述符上限不足时,大文件上传可能无法创建临时文件。执行
ulimit -n查看当前限制,临时调整可执行ulimit -n 65535;永久设置需修改/etc/security/limits.conf:tomcat soft nofile 65535 tomcat hard nofile 65535 - 重启Tomcat后测试上传。
5. 跟踪临时文件的生命周期
- 在代码中添加日志,跟踪临时目录的文件变化:
File tmpDir = new File(System.getProperty("java.io.tmpdir")); System.out.println("Tmp files before parse: " + Arrays.toString(tmpDir.list())); List<FileItem> items = upload.parseRequest(request); System.out.println("Tmp files after parse: " + Arrays.toString(tmpDir.list())); - 使用系统工具跟踪文件操作:
- Linux:
strace -p <tomcat-pid> -e trace=file,查看Tomcat进程的文件创建、删除操作; - Mac:
dtruss -p <tomcat-pid> -f -t open,unlink,追踪临时文件的生命周期。
- Linux:
6. 验证请求传输完整性
- 用curl模拟大文件上传,复现问题:
curl -X POST -F "file=@large-file.bin" http://your-server/upload-endpoint - 若curl能复现问题,说明问题在服务器端;若不能,需排查前端表单的
enctype是否正确设置为multipart/form-data(虽Windows正常,但仍需确认)。
内容的提问来源于stack exchange,提问作者SegmentationFault
相关产品推荐
相关产品推荐

