Ответ 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> тег