Как найти рабочую папку приложения на основе сервлета для загрузки ресурсов - PullRequest
27 голосов
/ 05 июля 2011

Я пишу сервлет Java, который хочу установить во многих экземплярах Tomcat на разных серверах.Сервлет использует некоторые статические файлы, которые упакованы с файлом war в WEB-INF.Это структура каталогов в типичной установке:

- tomcat
-- webapps
--- myapp
---- index.html
---- WEB-INF
----- web.xml
----- classes
------ src
------- .....
----- MY_STATIC_FOLDER
------ file1
------ file2
------ file3

Как узнать абсолютный путь к MY_STATIC_FOLDER, чтобы я мог читать статические файлы?

Я не могу полагаться на "текущая папка "(что я получаю в новом файле (". ")), потому что это зависит от того, откуда был запущен сервер Tomcat, который отличается в каждой установке!

Ответы [ 3 ]

40 голосов
/ 05 июля 2011

Вы можете использовать ServletContext#getRealPath() для преобразования относительного пути веб-контента в абсолютный путь к файловой системе диска.

String relativeWebPath = "/WEB-INF/static/file1.ext";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
File file = new File(absoluteDiskPath);
InputStream input = new FileInputStream(file);
// ...

Однако, если ваше единственное намерение - получить InputStream из этого, лучше использовать ServletContext#getResourceAsStream() вместо этого, так как getRealPath() может возвращать null всякий раз, когда WAR не расширяется в файловой системе локального диска (по умолчанию Tomcat делает, но настраивается, чтобы не делать)итак!):

String relativeWebPath = "/WEB-INF/static/file1.ext";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);
// ...

В конце концов, это гораздо надежнее, чем подход java.io.File.

См. также:

0 голосов
/ 05 июля 2011

Вы можете попробовать это
String relativeWebPath = "WEB-INF/static/file1.ext";<br> InputStream input = getServletContext().getResourceAsStream(relativeWebPath);

0 голосов
/ 05 июля 2011

Я бы предпочел использовать параметр getResourceaAsStream для загрузки ресурса на основе родительского каталога.

getClass().getClassLoader().getResourceAsStream("/MY_STATIC_FOLDER/file1");
...