Ошибка при загрузке файла на сервер
Мое веб-приложение сделано на 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, есть два вероятных объяснения:
Может быть проблема с разрешениями, препятствующая удалению старого файла образа. (Тот факт, что сообщения об ошибках говорят о том, что файл существует, означает, что путь к каталогу правильный, а каталог доступен для чтения. Но он не может быть обновлен "пользователем", работающим с JVM.)
Старый файл изображения может быть открыт. Windows обычно блокирует файлы, когда они открыты, и это предотвращает их удаление.
Я думаю, это может быть второй вариант, так как изображение отображается на странице, где есть метод изменения изображения. Как я могу заставить его закрыть?
Вам нужно найти код в вашем приложении, которое открывает файл изображения, и убедиться, что он всегда закрывает его, как только заканчивает читать. Рекомендуемый способ сделать это - использовать "попробовать с ресурсом". Например.
try (InputStream is = new FileInputStream(somePath)) {
// Do stuff with 'is'
}
Когда try
блок заканчивается, is
ресурс будет автоматически закрыт.
Если вы не можете найти / устранить утечку ресурса или файл открывается другим приложением, проблема (AFAIK) неразрешима.
Я не думаю, что это проблема разрешения или блокировки файла, потому что, если проблема была с файлом, она должна быть реплицирована также на первый случай.
Почему вы удаляете изображение, а затем передаете его, так как TransferTo() автоматически удаляет файл в месте назначения.
И я думаю, что это может сработать.
Теперь я думаю, что ответ касается блокировки файлов. когда вы вызываете метод TransferTo(), он должен открыть поток, который передает файл в файловую систему, и этот поток остается открытым. Этот открытый поток создает проблему.
если вы хотите удалить какой-либо файл, вы должны закрыть все ссылки, но в вашем случае он все еще открыт.