在服务器上上载文件时出错

col17t5w  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(338)

我的web应用程序是在SpringMVC上开发的。我有一个功能,用户可以更改他/她的个人资料图片。我将文件作为mutlipart文件发送到服务器。每次用户上传图片时,文件名都保持不变。
用户第一次上载新图片时,它会被更改,但如果用户第二次上载新图片,则会引发异常。
我的代码

File newImage = new File(profileFolder + File.separator + fileNewName + fileExt);
    if(newImage.exists())
    {
        newImage.delete();

    }

    imageFile.transferTo(newImage);

我有个例外

java.io.IOException: Destination file [FILE_NAME] already exists and could not be deleted
at org.springframework.web.multipart.commons.CommonsMultipartFile.transferTo(CommonsMultipartFile.java:137)
at controllers.MainController.uploadFile(MainController.java:2087)

请帮我解决这个问题。

p1tboqfb

p1tboqfb1#

问题是应用程序无法删除图像文件的现有副本来创建新副本。
这个 newImage.delete() 电话可能又来了 false 说它没有删除文件。
因为您使用的是windows,所以有两种可能的解释:
可能存在权限问题,无法删除旧图像文件(错误消息表明文件存在,这意味着目录路径正确,并且目录可读。但运行jvm的“用户”可能无法更新它。)
旧图像文件可能已打开。windows通常会在文件打开时锁定文件,这样可以防止文件被删除。
我认为,它可能是第二个选项,因为图像显示在页面上,而更改图片的方法就在那里。我怎么才能强行关上它?
您需要在应用程序中找到打开图像文件的代码,并确保它总是在读取完图像文件后立即将其关闭。推荐的方法是使用“try with resource”。例如。

try (InputStream is = new FileInputStream(somePath)) {
    // Do stuff with 'is'
}

try 块终止,则 is 资源将自动关闭。
如果找不到/修复资源泄漏,或者文件正被另一个应用程序打开,那么这个问题(afaik)是难以解决的。

gblwokeq

gblwokeq2#

我不认为这是一个权限问题或文件锁定问题,因为如果问题是与文件,它应该复制到第一种情况以及。
为什么要删除图像,然后以transferto()的形式传输?自动删除目标位置的文件。
我想这可能有用。
现在,我认为答案与文件锁定有关。当您调用transferto()方法时,它必须打开一个流,该流将文件传输到文件系统,并且该流保持打开状态。这个打开的流产生了问题。
如果你想删除任何文件,你必须关闭它的所有引用,但在你的情况下,它仍然是打开的。

相关问题