Ошибка при загрузке файла на сервер

Мое веб-приложение сделано на 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 ответа

Проблема в том, что приложение не может удалить существующую копию файла изображения, чтобы создать новую.

newImage.delete() звонок, вероятно, возвращается false сказать, что он не удалил файл.

Поскольку вы работаете в Windows, есть два вероятных объяснения:

  1. Может быть проблема с разрешениями, препятствующая удалению старого файла образа. (Тот факт, что сообщения об ошибках говорят о том, что файл существует, означает, что путь к каталогу правильный, а каталог доступен для чтения. Но он не может быть обновлен "пользователем", работающим с JVM.)

  2. Старый файл изображения может быть открыт. Windows обычно блокирует файлы, когда они открыты, и это предотвращает их удаление.


Я думаю, это может быть второй вариант, так как изображение отображается на странице, где есть метод изменения изображения. Как я могу заставить его закрыть?

Вам нужно найти код в вашем приложении, которое открывает файл изображения, и убедиться, что он всегда закрывает его, как только заканчивает читать. Рекомендуемый способ сделать это - использовать "попробовать с ресурсом". Например.

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

Когда try блок заканчивается, is ресурс будет автоматически закрыт.

Если вы не можете найти / устранить утечку ресурса или файл открывается другим приложением, проблема (AFAIK) неразрешима.

Я не думаю, что это проблема разрешения или блокировки файла, потому что, если проблема была с файлом, она должна быть реплицирована также на первый случай.

Почему вы удаляете изображение, а затем передаете его, так как TransferTo() автоматически удаляет файл в месте назначения.

И я думаю, что это может сработать.

Теперь я думаю, что ответ касается блокировки файлов. когда вы вызываете метод TransferTo(), он должен открыть поток, который передает файл в файловую систему, и этот поток остается открытым. Этот открытый поток создает проблему.

если вы хотите удалить какой-либо файл, вы должны закрыть все ссылки, но в вашем случае он все еще открыт.

Другие вопросы по тегам