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

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,追踪临时文件的生命周期。

6. 验证请求传输完整性

  • 用curl模拟大文件上传,复现问题:
    curl -X POST -F "file=@large-file.bin" http://your-server/upload-endpoint
    
  • 若curl能复现问题,说明问题在服务器端;若不能,需排查前端表单的enctype是否正确设置为multipart/form-data(虽Windows正常,但仍需确认)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 10:55:06