如何移动Primefaces-Upload-Temp-Files而不是进行时间密集的复制过程?

我想用Java EE上传大于2 GB的文件并使用primefaces。 总的来说,这不是什么大问题,但我有一点问题。 PrimeFaces的常用方法是上传文件,使用UploadedFile-Object,从中获取InputStream,然后将其写入磁盘。

但是写入磁盘大文件是一项耗时的任务。 相反,我想在文件系统中找到上传的文件,然后将其移动到我存储所有文件的文件夹,因为移动文件不会浪费时间。

所以,根据这个问题,我想出了设置PrimeFaces-Tmp文件夹和大小限制,当文件放在那里。 现在每个上传的文件都直接进入该文件夹。 关键是,我现在在磁盘上有一个文件,而用户正在上传 – 之后不再创建它。

到现在为止还挺好。 我可以识别文件并移动它(虽然它有一个奇怪的名字)。 但是指向Primefaces Userguide(页187) ,此Tmp-Folder仅在内部使用。 我甚至会从Primefaces窃取UploadedFile-Object的内容。 对我来说似乎不是一个干净的解决方案。

任何提示如何实现这一目标?

我也看到了这个问题 。 也可能是我的头衔,但这不是我想要的。

编辑:

由于评论,一些代码。 首先,我在fileUploadListener中收集UploadFile-Objects:

public void handleFileUpload(FileUploadEvent event) throws IOException { FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded."); FacesContext.getCurrentInstance().addMessage(null, msg); getUploadedFilesDTO().add(new UploadedFileDTO(event.getFile(), uploadedFilesCounter)); uploadedFilesCounter++; } 

在EJB的第二个我为每个UploadedFile-Object调用copyFile:

 private void copyFile(UploadedFile uploadedFile, String randomFilename) throws IOException { InputStream originalFile = uploadedFile.getInputstream(); OutputStream fileOutput = null; try { fileOutput = new FileOutputStream("/pvtfiles/" + randomFilename); IOUtils.copy(originalFile, fileOutput); } finally { IOUtils.closeQuietly(fileOutput); IOUtils.closeQuietly(originalFile); } } 

通过创建自己的filter它不会创建临时文件。 请在下面的另一篇文章中阅读我的答案

https://stackoverflow.com/a/19581257/185022

我能够通过编写自定义filter来做到这一点,如AZ_建议,并添加以下内容:

 FileItem fileItem = multipartRequest.getFileItem("form:fileUpload"); File file = new File(uploadDir + "/" + fileItem.getName()); fileItem.write(file); 

诀窍是使用MultipartRequest对象来获取FileItem对象。 FileItemwrite方法可用于将文件保存在其他位置或使用其他名称。 根据文档,一些实现可能仍然使用副本执行此操作,但我正在使用的(Apache Commons 1.3)似乎通过重命名/移动来执行此操作。 请注意, getFileItem用于查找FileItem的字符串是标记中的ID属性。

更多代码:

web.xml修改部分:

  PrimeFaces FileUpload Filter some.package.CustomFileUploadFilter  

示例jsf:

      

示例自定义filter类:

 package some.package; import java.io.File; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.primefaces.webapp.MultipartRequest; import org.primefaces.webapp.filter.FileUploadFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CustomFileUploadFilter extends FileUploadFilter { private static final Logger LOG = LoggerFactory.getLogger(CustomFileUploadFilter.class); private String thresholdSize; private String uploadDir; private final static String THRESHOLD_SIZE_PARAM = "thresholdSize"; private final static String UPLOAD_DIRECTORY_PARAM = "uploadDirectory"; @Override public void init(FilterConfig filterConfig) throws ServletException { thresholdSize = filterConfig.getInitParameter(THRESHOLD_SIZE_PARAM); uploadDir = filterConfig.getInitParameter(UPLOAD_DIRECTORY_PARAM); LOG.info("CatalogFileUploadFilter initiated successfully"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) request; boolean isMultipart = ServletFileUpload.isMultipartContent(httpServletRequest); if (isMultipart) { LOG.info("Parsing file upload request"); DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(); 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); try { FileItem fileItem = multipartRequest.getFileItem("form:fileUpload"); File file = new File("path/to/location/" + fileItem.getName()); fileItem.write(file); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } LOG.info("File upload request parsed successfully, continuing with filter chain with a wrapped multipart request"); filterChain.doFilter(multipartRequest, response); } else { filterChain.doFilter(request, response); } } }