7

PrimeFaces UploadedFile は、ファイル自体ではなく、InputStream のみを公開します。ストリームの処理後に削除するにはどうすればよいですか?

4

2 に答える 2

9

PrimeFacesは、このためにApacheCommonsFileUploadを使用しています。ファイルは一時ファイルとして作成されるため、Javaガベージコレクタの実行時に開いているファイルや参照がない場合、ファイルはすでに自動的に削除されます。FileInputStream

InputStreamしたがって、後処理(ブロック内!)を確実に閉じることができれば、finallyクリーンアップについて心配する必要はありません。

于 2012-08-20T12:22:11.167 に答える
2

サーバーを再起動するまで、一部のファイルは削除されますが、すべてのファイルは削除されません。私は JBoss 2.4.3 で作業しており、サーブレット 2.4 で JSF 2.0 のサポートを追加しました。ここで私の他の質問の完全な詳細を読んでください

独自のフィルターを作成する必要があります。Apache Web サイトで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);
        }

    }

コンテキストが初期化されたときに呼び出されるサーブレットがあり、そこから ServletContext を取得すると、 request.getSession.getServletContext のように実行できます...これを検証してください

ステップ2:

web.xml に移動し、フィルター calss を param に追加します。

<filter-class>com.sf.server.filter.FileUploadFilter_</filter-class>     

これで、すべての一時ファイルが削除されます。

于 2013-10-25T04:45:25.323 に答える