【问题标题】:apache FileUpload, tmp files deleted prematurelyapache FileUpload,tmp文件过早删除
【发布时间】:2012-06-22 21:39:30
【问题描述】:

从我的服务器日志中,当我尝试在 FileItem 上调用 getInputStream 时:

6/22/12 14:31:14 ERROR c.s.u.WizardUploadReceiver:225          | Jumploader: Problem uploading zip13afcchr.psd - Failed to handle post properly
java.io.FileNotFoundException: uploadtemp\upload__3e026c78_13815404c62__7ff2_00000141.tmp (The system cannot find the file specified)
    at java.io.FileInputStream.open(Native Method) ~[na:1.6.0_23]
    at java.io.FileInputStream.<init>(FileInputStream.java:106) ~[na:1.6.0_23]
    at org.apache.commons.fileupload.disk.DiskFileItem.getInputStream(DiskFileItem.java:236) ~[commons-fileupload-1.2.2.jar:1.2.2]
...

据我所知,在我的 servlet 方法返回之前,我已经验证了关联的 File 和 FileItem 以及 DiskFileItemFactory 不会超出范围(有资格进行垃圾回收)。

我只是在寻找可能导致 FileUpload 过早删除这些临时文件的其他潜在情况。

附加信息:我只在特定客户端上传文件时看到此问题。发送到其他客户端上的相同 servlet 的相同文件似乎不会导致此问题。我还没有发现有问题的客户和没有问题的客户之间的区别。

【问题讨论】:

  • 您的根目录中是否有“uploadtemp”目录?
  • 请注意,您有两个错误。 Problem uploading... 后跟 FileNotFoundException
  • ilya - 是的,在应用根目录下的子目录中
  • Jim Garrison - 您误读了日志消息。我正在记录一条自定义消息以及相关的异常堆栈跟踪。您可能需要阅读日志框架。
  • 你是在使用 Jumploader 上传文件吗?

标签: java apache servlets file-upload


【解决方案1】:

文件大小可能超过 10 Kb(默认阈值)。当您使用 DiskFileItemFactory 解析请求时,您应该设置一个新的阈值,例如:

DiskFileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload upload = new ServletFileUpload(factory);

**factory.setSizeThreshold(102400);**

List /* FileItem */ items = upload.parseRequest(request);

【讨论】:

  • 不,根本不是这样