Multipart Upload Servlet 3.0 - 不删除的临时文件

Pre*_*ete 5 java servlets multipartform-data servlet-3.0

我有一个上传的servlet工作得很好,但留下了临时文件.我正在尝试使用part.delete()来清理它们,但它们并没有删除.

文档说容器会在GC执行时删除它们.但即使我等了一个小时并最终关闭了服务器,他们仍然在那里......

有什么诀窍?现在是Windows上的Eclipse Kepler和Tomcat 7.0.47.但生产将是Linux.

谢谢

代码大致浓缩:

@MultipartConfig(location = "C:/tmp",
    fileSizeThreshold=1024*1024*10, // 10MB
    maxFileSize=1024*1024*10,      // 10MB
    maxRequestSize=1024*1024*50)   // 50MB
@WebServlet("/upload.do")

    ...

for (Part part : request.getParts()) {
    String filename = getFilename(part);
    if(!(filename==null)){
        part.write("/elsewhere/"+filename);
        part.delete();
    } else {
        out.println("skip field...");
    }
}   
Run Code Online (Sandbox Code Playgroud)

Bhu*_*ava 1

您好,您可以像这样创建 Servlet Listner

 @WebListener
 public class ContextListner implements ServletRequestListener, ServletContextListener {

       public ContextListner() {

        }

       public void requestDestroyed(ServletRequestEvent sre) {
              deleteDir(sre.getServletContext().getRealPath("") + File.separator + UploadConstants.TEMP_DIR);
       }

       public void contextInitialized(ServletContextEvent sce) {

       }

       public void contextDestroyed(ServletContextEvent sce) {
              deleteDir(sce.getServletContext().getRealPath("") + File.separator + UploadConstants.TEMP_DIR);
       }

       public void requestInitialized(ServletRequestEvent sre) {

       }

        private void deleteDir(final String dirPath) {

            if (null == dirPath)
               return;

            File dir = new File(dirPath);
            if (dir.exists() && dir.isDirectory()) {
            File[] files = dir.listFiles();
            if (null != files) {
             for (File file : files) {
                file.delete();
            }
        }
    }

    }

 }
Run Code Online (Sandbox Code Playgroud)

并用注释标记您的 servlet,如下所述。

@WebListener(value = "ContextListner")
Run Code Online (Sandbox Code Playgroud)

这将删除临时目录或您指定的目录下的临时文件。

 public void requestDestroyed(ServletRequestEvent sre) {
          deleteDir(sre.getServletContext().getRealPath("") + File.separator + UploadConstants.TEMP_DIR);
   }
Run Code Online (Sandbox Code Playgroud)

响应发送回客户端后调用此方法。