【问题标题】:Multipart Upload Servlet 3.0 - temporary files not deletingMultipart Upload Servlet 3.0 - 临时文件未删除
【发布时间】:2014-01-03 16:38:12
【问题描述】:

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

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

有什么诀窍?目前是 Windows 上带有 Tomcat 7.0.47 的 Eclipse Kepler。但生产将是 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...");
    }
}   

【问题讨论】:

  • 无关,但if (filename != null)
  • Part 的全名是什么?
  • 不确定您的意思?班上? javax.servlet.http.Part 和请求来自受保护的 void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {... 使用新的 Servlet 3.0 东西。

标签: java servlets multipartform-data servlet-3.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);
   }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多