Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在服务器上上载文件时出错_Java_Spring Mvc_Apache Commons Io - Fatal编程技术网

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

Java 在服务器上上载文件时出错,java,spring-mvc,apache-commons-io,Java,Spring Mvc,Apache Commons Io,我的web应用程序是在SpringMVC上开发的。 我有一个功能,用户可以更改他/她的个人资料图片。我正在将文件作为mutlipart文件发送到服务器。每次用户上传图片时,文件名都保持不变 用户第一次上传新图片时,图片会被更改,但如果用户第二次上传新图片,则会引发异常 我的代码 File newImage = new File(profileFolder + File.separator + fileNewName + fileExt); if(newImage.exists())

我的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)

请帮我解决这个问题。

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

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

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

  • 可能存在权限问题,无法删除旧图像文件。(错误消息表示文件存在,这意味着目录路径正确,目录可读。但运行JVM的“用户”可能无法更新该文件。)

  • 旧图像文件可能已打开。Windows通常会在文件打开时锁定文件,从而防止删除这些文件


  • 我认为,它可能是第二个选项,因为图像显示在页面上,更改图片方法就在那里。我怎样才能强制关闭它

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

    try (InputStream is = new FileInputStream(somePath)) {
        // Do stuff with 'is'
    }
    
    try
    块终止时,
    is
    资源将自动关闭


    如果您无法找到/修复资源泄漏,或者该文件正由另一个应用程序打开,则问题(AFAIK)是难以解决的。

    我认为这不是权限问题或文件锁定问题,因为如果该问题与文件有关,则也应复制到第一种情况

    为什么要删除图像,然后作为transferTo()传输自动删除目标位置的文件

    我认为这可能会奏效

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


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

    Linux或windows计算机?听起来可能是权限问题。您是如何运行Spring应用程序的(例如,在管理模式或其他模式下)?但是该文件第一次被删除。当我第二次尝试上传时会出现错误。第一次上传意味着用户已经有了一个图像并试图更改它,对吗?我认为第一次不会删除该文件。第二次错误是在创建过程中出现的。文件是在
    标记中打开的,但它以前也打开过,因此不会影响它。我仅使用file file和MultipartFile引用该文件。我怎样才能关闭它们?这给了我同样的问题。