我想使用 primefaces 使用 Java EE 上传大于 2 GB 的文件。一般来说,这没什么大不了的,但我有一个小问题。PrimeFaces 的通常方式是上传一个文件,拥有 UploadedFile-Object,从中获取 InputStream,然后将其写入磁盘。
但是写入磁盘大文件是一项耗时的任务。相反,我想在文件系统中找到上传的文件,然后将其移动到我存储所有文件的文件夹中,因为移动文件不会浪费时间。
因此,根据这里的这个问题,我想设置 PrimeFaces-Tmp-folder 和大小限制,文件何时放在那里。现在每个上传的文件都直接进入该文件夹。关键是,我现在在磁盘上有一个文件,而用户正在上传 - 而不是之后创建它。
到现在为止还挺好。我可以识别文件并移动它(尽管它有一个奇怪的名称)。但是指向Primefaces Userguide (Page 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);
}
}