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

时间:2016-03-28 12:09:25

标签: java spring-mvc apache-commons-io

我的网络应用程序是在Spring MVC上制作的。 我有一个功能,用户可以更改他/她的个人资料图片。我将文件作为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 个答案:

答案 0 :(得分:2)

问题是应用程序无法删除映像文件的现有副本以创建新副本。

newImage.delete()调用可能会返回false表示它没有删除该文件。

由于您使用的是Windows,因此有两种可能的解释:

  1. 可能存在阻止删除旧图像文件的权限问题。 (错误消息表明文件存在的事实意味着目录路径是正确的,并且目录是可读的。但是运行JVM的用户可能无法更新。)

  2. 旧图像文件可能已打开。 Windows通常会在文件打开时将其锁定,这样可以防止文件被删除。

  3.   

    我认为,它可能是第二个选项,因为图像显示在更改图片方法所在的页面上。我该怎么强行关闭呢?

    您需要在应用程序中找到打开图像文件的代码,并确保始终一旦完成读取就将其关闭。建议的方法是使用"尝试使用资源"。例如。

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

    try块终止时,is资源将自动关闭。

    如果您无法找到/修复资源泄漏,或者其他应用程序正在打开该文件,则问题是(AFAIK)难以处理。

答案 1 :(得分:0)

我不认为这是一个权限问题或文件锁定问题,因为如果问题是文件,那么它也应该复制到第一个案例。

为什么要删除图像然后传输为transferTo()会自动删除目的地的文件。

我认为它可能会奏效。

现在,我认为答案与文件锁定有关。当你调用transferTo()方法时,它必须打开一个流,该文件将文件传输到文件系统,并且该流被打开。打开的流正在创建问题。

如果您要删除任何文件,您必须关闭它的所有引用,但在您的情况下它仍然打开。