【问题标题】:Error while uploading the file on the server在服务器上上传文件时出错
【发布时间】:2016-03-28 12:09:25
【问题描述】:

我的 Web 应用是在 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)

请帮我解决这个问题。

【问题讨论】:

  • Linux 还是 windows 机器?
  • 这听起来可能是权限问题。你是如何运行你的 Spring 应用程序的(例如,在管理模式或其他模式下)?
  • 但是文件第一次被删除了。当我第二次尝试上传时它会出错。
  • 第一次上传意味着用户已经有一张图片并试图改变它,对吗?
  • 我认为文件不是第一次被删除。在 creation 期间第二次出现错误。

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


【解决方案1】:

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

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

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

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

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


我认为,它可以是第二个选项,因为图像显示在更改图片方法所在的页面上。如何强制关闭?

您需要在应用程序中找到打开图像文件的代码,并确保它总是在完成读取后立即关闭它。推荐的方法是使用“try with resource”。例如。

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

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

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

【讨论】:

  • 文件是在<img>标签中打开的,但之前也打开过,所以应该不会影响它。我仅使用 File 文件和 MultipartFile 文件引用该文件。我怎样才能关闭它们?
【解决方案2】:

我不认为这是权限问题或文件锁定问题,因为如果问题出在文件上,它也应该复制到第一种情况。

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

我认为它可能会起作用。

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

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

【讨论】:

  • 这给了我同样的问题。
猜你喜欢
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多