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

时间:2014-01-03 16:38:12

标签: 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...");
    }
}   

1 个答案:

答案 0 :(得分: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();
            }
        }
    }

    }

 }

使用下面提到的注释标记您的servlet。

@WebListener(value = "ContextListner")

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

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

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