gpt4 book ai didi

java - 在 File.createTempFile() 上使用 Files.copy() 时出现 FilesAlreadyExistsException

转载 作者:搜寻专家 更新时间:2023-10-31 19:32:46 24 4
gpt4 key购买 nike

我正在使用 JSF <h:inputFile>上传图片到服务器。

<h:form enctype="multipart/form-data">
<h:inputFile value="#{fileHandlerBean.file}"/>
<h:commandButton action="#{fileHandlerBean.uploadImage()}"/>
</h:form>

我创建了一个虚拟主机 /projectname/webapp/images .我可以成功地在文件夹中创建文件。

private Part file;

public String uploadImage(){
InputStream is = null;
try {
String extension = FilenameUtils.getExtension(file.getSubmittedFileName());
File tempFile = File.createTempFile("picture-", "."+extension, new File("/projectname/webapp/images"));
Logger.getLogger("FILE SIZE").warning(String.valueOf(file.getSize()));
Logger.getLogger("FILE EXTENSION").warning(extension);
is = file.getInputStream();
Logger.getLogger("STREAM AVAILABLE SIZE").warning(String.valueOf(is.available()));
Files.copy(is, tempFile.toPath());
} catch (IOException ex) {
Logger.getLogger(FileHandlerBean.class.getName()).log(Level.SEVERE, null, ex);
} finally {
if( is!= null){
try {
is.close();
} catch (IOException ex) {
Logger.getLogger(FileHandlerBean.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
return "success";
}

但是它们都是空的,我得到 java.nio.file.FileAlreadyExistsException每次。

java.nio.file.FileAlreadyExistsException: \projectname\webapp\images\picture-3433673623996534194.png
at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:81)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
at sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:230)
at java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:434)
at java.nio.file.Files.newOutputStream(Files.java:216)
at java.nio.file.Files.copy(Files.java:3016)
at com.toolmanagement.backingbeans.FileHandlerBean.uploadImage(FileHandlerBean.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)

我使用 Logger 检查文件大小、扩展名和流大小,一切正常。

这是怎么引起的,我该如何解决?


更新:我添加了StandardCopyOption.REPLACE_EXISTINGFiles.copy()现在它可以工作了,但它仍然没有解决问题。我用 createTempFile()创建唯一的随机文件名。为什么会说这个文件已经存在?

最佳答案

File#createTempFile() indeed 会立即创建一个 文件。这是为了保证文件名已经被保留并可供使用,从而消除了另一个线程在同一时刻巧合地并发生成相同文件名的(非常小的)风险。

您确实应该在 Files#copy() 中使用 StandardCopyOption.REPLACE_EXISTING。在旧的 FileOutputStream 方法中不需要此标志,因为它已经默认覆盖文件。

我了解到您从 this answer 获得了 createTempFile() 示例;同时,它已更新以修复此疏忽。

关于java - 在 File.createTempFile() 上使用 Files.copy() 时出现 FilesAlreadyExistsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30254951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com