PrimeFaces UploadedFile は、ファイル自体ではなく、InputStream のみを公開します。ストリームの処理後に削除するにはどうすればよいですか?
2 に答える
PrimeFacesは、このためにApacheCommonsFileUploadを使用しています。ファイルは一時ファイルとして作成されるため、Javaガベージコレクタの実行時に開いているファイルや参照がない場合、ファイルはすでに自動的に削除されます。File
InputStream
InputStream
したがって、後処理(ブロック内!)を確実に閉じることができれば、finally
クリーンアップについて心配する必要はありません。
サーバーを再起動するまで、一部のファイルは削除されますが、すべてのファイルは削除されません。私は 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>
これで、すべての一時ファイルが削除されます。