Получение пути к файлу ресурса из управляемого компонента в JSF - PullRequest
11 голосов
/ 08 июня 2011

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

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

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

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

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

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

1 Ответ

28 голосов
/ 08 июня 2011

Я понимаю, что файл встроен в 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, используя тег или image

...