Java Servlet 3.0文件上传-删除TMP文件



我使用Java Servlet 3.0上传文件,使用@MultipartConfig注释和request.getParts()获取文件。

上传文件时,在Web Application工作目录(tomcat/work/Catalina/localhost/webappname)下创建一个TMP文件。例如:

upload_7c59101b_9f97_4e3f_9fa5_e484056d26fa_00000209.tmp

应用程序将文件复制到服务器上的另一个目录-我使用part.write()方法执行此操作,但它也通过获取输入流和写入字节来工作。两种方法都可以。

我需要在上传后删除TMP文件,但我这样做有麻烦。part.delete()方法不做任何事情。我还尝试使用javax.servlet.context.tempdir访问目录中的文件并迭代删除它们,但是在调用删除方法时,它总是返回false。从Files.nio中使用Files.delete(path)方法将返回一个异常,该异常声称该文件正在被另一个程序使用(即锁定),因此不能删除。

操作系统为Windows server 2012 R2。

有没有人有其他的解决方案来删除这些TMP文件?值得指出的是,我也尝试过使用HttpRequestListener,但仍然无法删除文件。

多谢

您不应该(必须)直接操作这些文件,您应该使用特定PartgetInputStream()方法来获取上传文件的内容。servlet容器(在您的示例中是Tomcat)将——或者至少应该——处理临时文件。

InputStream.close()一起,使用Part.delete()删除work目录下存储的临时文件。请参考javadoc: Part.delete().

我同意Jozef Chocholacek的回答,简单的解决方案关闭输入。我们使用MultiPart消息来上传文件。由于我们没有关闭inputStream,所以文件在那里存储了很长时间。只有在服务器重新启动时才删除。

稍微改变一下实现,总是在末尾关闭输入部分。

使用try-> catch-> finally并将close放在finally部分中即使方法调用失败也始终调用。

服务器不再存储。tmp文件

最新更新