如何在处理后删除PrimeFaces UploadedFile临时文件?

时间:2012-08-19 05:05:48

标签: java jsf primefaces

PrimeFaces UploadedFile仅公开InputStream,而不公开File本身。如何在处理流后删除它?

2 个答案:

答案 0 :(得分:8)

PrimeFaces使用了Apache Commons FileUpload。它会将文件创建为临时文件,因此如果Java垃圾收集器运行时没有打开FileInputStream引用,则文件将自动删除

因此,如果您可以确保在处理后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>     

现在完成它将删除所有临时文件。