我的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)
请帮我解决这个问题。
2条答案
按热度按时间p1tboqfb1#
问题是应用程序无法删除图像文件的现有副本来创建新副本。
这个
newImage.delete()
电话可能又来了false
说它没有删除文件。因为您使用的是windows,所以有两种可能的解释:
可能存在权限问题,无法删除旧图像文件(错误消息表明文件存在,这意味着目录路径正确,并且目录可读。但运行jvm的“用户”可能无法更新它。)
旧图像文件可能已打开。windows通常会在文件打开时锁定文件,这样可以防止文件被删除。
我认为,它可能是第二个选项,因为图像显示在页面上,而更改图片的方法就在那里。我怎么才能强行关上它?
您需要在应用程序中找到打开图像文件的代码,并确保它总是在读取完图像文件后立即将其关闭。推荐的方法是使用“try with resource”。例如。
当
try
块终止,则is
资源将自动关闭。如果找不到/修复资源泄漏,或者文件正被另一个应用程序打开,那么这个问题(afaik)是难以解决的。
gblwokeq2#
我不认为这是一个权限问题或文件锁定问题,因为如果问题是与文件,它应该复制到第一种情况以及。
为什么要删除图像,然后以transferto()的形式传输?自动删除目标位置的文件。
我想这可能有用。
现在,我认为答案与文件锁定有关。当您调用transferto()方法时,它必须打开一个流,该流将文件传输到文件系统,并且该流保持打开状态。这个打开的流产生了问题。
如果你想删除任何文件,你必须关闭它的所有引用,但在你的情况下,它仍然是打开的。