Подтвердить что ты не робот

Как найти рабочую папку приложения на основе сервлета для загрузки ресурсов

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

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

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

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

4b9b3361

Ответ 1

Вы можете использовать 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.

См. также:

Ответ 2

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

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

Ответ 3

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