我有一个上传的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...");
}
}
答案 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);
}
此方法在响应发送回客户端后获得调用。