7

PrimeFaces UploadedFile 只公开 InputStream,而不是文件本身。处理流后如何删除它?

4

2 回答 2

9

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

因此,如果您可以绝对确保关闭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 回答