File upload 在Primefaces中,存储在临时目录中的上传文件在读取后不会自动删除 在我的xhtml中,我使用p:fileUpload标记 在会话作用域bean中,我保留了对UploadedFile的引用

File upload 在Primefaces中,存储在临时目录中的上传文件在读取后不会自动删除 在我的xhtml中,我使用p:fileUpload标记 在会话作用域bean中,我保留了对UploadedFile的引用,file-upload,primefaces,temporary-files,File Upload,Primefaces,Temporary Files,基本上我是这样做的: private UploadedFile uploadedFile; public void fileUpload(FileUploadEvent event) throws IOException { uploadedFile = event.getFile(); } 通过一个单独的按钮,调用会话bean中的一个操作,将上传的文件复制到另一个位置。基本上我是这样做的: File fileTo =new File(“/xyz/abc.def”); Files.c

基本上我是这样做的:

private UploadedFile uploadedFile;

public void fileUpload(FileUploadEvent event) throws IOException {
    uploadedFile = event.getFile();
}
通过一个单独的按钮,调用会话bean中的一个操作,将上传的文件复制到另一个位置。基本上我是这样做的:

File fileTo =new File(“/xyz/abc.def”);
Files.copy(uploadedFile.getInputstream(), fileTo.toPath(), StandardCopyOption.REPLACE_EXISTING);
现在情况如下:

每次上传调用都会在我的临时目录中创建一个临时文件。这没关系

每次上载调用时,变量uploadedFile都会被event.getFile()覆盖。因此,UploadedFile的前一个实例稍后会被垃圾收集。Primefaces在封面下使用Apache的FileUpload,如果UploadedFile被垃圾收集,它会删除临时文件。我可以看出这是可行的,所以这也没关系。因此,场景是一个接一个地上传文件。我可以看到,在每次上传的temp目录中都会创建一个新的temp文件,并且在一段时间(1分钟左右)后,它们会被神奇地删除,即在垃圾收集过程中被删除。这很好用

在我调用复制以前上载的文件的操作时,此特定文件不再被删除,即使我稍后上载其他文件,并且变量uploadedFile包含对其他实例的引用。我尝试了几种其他技术来复制文件,比如使用Apaches IOUtils,或者完全手工制作一个while循环,在缓冲区中读写字节。无论我尝试什么,似乎在我开始从输入流读取从UploadedFile获得的字节时,临时文件不再被删除

任何可能出错的想法。
Primefaces 3.5版和5.2版都有这种行为。

为什么不移动它,而不是复制?并尝试关闭inputstream?@Kukeltje,我认为我无法移动文件,因为UploadedFile类只提供了一个inputstream()方法,我看不到如何将输入流移动到另一个位置。是的,我还尝试在复制后关闭输入流,但这也没有帮助。实际上,我认为没有必要显式地关闭InputStream,因为当UploadedFile被垃圾回收时,该文件将被删除(在我阅读后的情况除外…)。也就是说,所描述的行为完全相同,输入流显式关闭,而没有。