Получение пути к файлу ресурсов из управляемого bean в JSF

У меня такая ситуация: я пытаюсь удалить старый образ аватара для пользователя перед тем, как поместить новый из управляемого bean.

String fileName = "resources/img/useravatars/" + getSessionBean().getSearchAccount().getAvatar();
File f = new File(fileName);

Я немного искал googled, и мне кажется, что я могу получить путь к этой папке из ExternalContext, например:

FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.getExternalContext(). ...

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

PS. Так или иначе, я подозреваю, что можно жестко привязать ссылку, но пока не повезло.

Ответ 1

Я понимаю, что файл встроен в WAR и что вы ищете метод ExternalContext#getRealPath() для его решения на основе веб-относительный путь. Согласно Javadoc, этот метод вводится в JSF 2.0 и не существует в JSF 1.x. Кажется, вы используете JSF 1.x, иначе вы бы не задали этот вопрос. Вместо этого вы должны использовать ServletContext#getRealPath() (это также то, что делегирует новый метод JSF 2.0 под обложками).

String relativeWebPath = "/resources/img/useravatars/" + ...;
ServletContext servletContext = (ServletContext) externalContext.getContext();
String absoluteDiskPath = servletContext.getRealPath(relativeWebPath);
File file = new File(absoluteDiskPath);
// ...

Однако существует большая НО: вы можете и не должны писать в расширенную WAR. Удаление файлов также записывается. Всякий раз, когда вы переводите WAR или перезапускаете сервер, каждое изменение будет отменено, а расширенная WAR сохранит свое первоначальное состояние, тем самым потеряв все изменения, внесенные в расширенную WAR с момента последнего развертывания.

Вам действительно нужно хранить эти файлы во внешнем месте, чье корневое местоположение затем может быть жестко закодировано или определено в каком-либо файле внешней конфигурации (свойства). Таким образом вы можете использовать java.io.File обычный способ.

Существует несколько способов обслуживания файлов из внешнего местоположения. Вы можете найти их все в ответ на следующий вопрос: Загружать изображения из-за пределов webapps/webcontext/deploy, используя < h: graphicImage > или <img> тег