PrimeFaces UploadedFile 只公开 InputStream,而不是文件本身。处理流后如何删除它?
问问题
8390 次
2 回答
9
PrimeFaces 为此使用了 Apache Commons FileUpload。它将文件创建为临时文件,因此如果在 Java 垃圾收集器运行时没有打开或引用该文件,则该文件将被自动删除。File
InputStream
因此,如果您可以绝对确保关闭InputStream
后处理(在finally
块中!),那么您无需担心清理。
于 2012-08-20T12:22:11.167 回答
2
在您重新启动服务器之前,它将删除一些文件但不是所有文件。我正在使用 JBoss 2.4.3 并在 Servlet 2.4 中添加了对 JSF 2.0 的支持。请在此处阅读有关我的其他问题的完整详细信息
那么您需要编写自己的过滤器在 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 并在参数中添加您的过滤器
<filter-class>com.sf.server.filter.FileUploadFilter_</filter-class>
现在全部完成,它将删除所有临时文件。
于 2013-10-25T04:45:25.323 回答