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)
您好,您可以像这样创建 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)
响应发送回客户端后调用此方法。