PrimeFaces UploadedFile仅公开InputStream,而不公开File本身。如何在处理流后删除它?
答案 0 :(得分:8)
PrimeFaces使用了Apache Commons FileUpload。它会将文件创建为临时文件,因此如果Java垃圾收集器运行时没有打开File
或InputStream
引用,则文件将已自动删除
因此,如果您可以确保在处理后InputStream
阻止finally
中关闭{{1}},那么您无需担心清理。
答案 1 :(得分:2)
在重新启动Server之前,它将删除一些文件但不删除所有文件。我正在使用JBoss 2.4.3并在Servlet 2.4中添加对JSF 2.0的支持。请阅读我的其他问题here
的完整详情您需要编写自己的过滤器在Apache网站上阅读有关FileCleaningTracker的更多信息。
第1步:
使用org.primefaces.webapp.filter.FileUploadFilter
扩展您的课程并覆盖以下方法
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
boolean isMultipart = ServletFileUpload.isMultipartContent(httpServletRequest);
if (isMultipart) {
if (logger.isLoggable(Level.FINE))
logger.fine("Parsing file upload request");
FileCleaningTracker fileCleaningTracker = FileCleanerCleanup.getFileCleaningTracker(ContextConfigServlet.SERVLET_CONTEXT);
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
diskFileItemFactory.setFileCleaningTracker(fileCleaningTracker);
if (thresholdSize != null)
diskFileItemFactory.setSizeThreshold(Integer.valueOf(thresholdSize).intValue());
if (uploadDir != null)
diskFileItemFactory.setRepository(new File(uploadDir));
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
MultipartRequest multipartRequest = new MultipartRequest(httpServletRequest, servletFileUpload);
if (logger.isLoggable(Level.FINE))
logger.fine("File upload request parsed succesfully, continuing with filter chain with a wrapped multipart request");
filterChain.doFilter(multipartRequest, response);
} else {
filterChain.doFilter(request, response);
}
}
我有一个在初始化上下文时调用的Servlet,从那里获取ServletContext,你可以像request.getSession.getServletContext那样做...请验证这个
<强>步骤2:强>
转到你的web.xml并在param
中添加你的过滤器calss<filter-class>com.sf.server.filter.FileUploadFilter_</filter-class>
现在完成它将删除所有临时文件。