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

Я пишу сервлет 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, который отличается при каждой установке!

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

    Смотрите также:

    • getResourceAsStream () vs FileInputStream
    • Что означает servletcontext.getRealPath (“/”) и когда я должен его использовать
    • Где разместить и как читать файлы ресурсов конфигурации в приложении на основе сервлета?
    • Рекомендуемый способ сохранения загруженных файлов в приложении сервлета

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

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

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

    Interesting Posts

    Hibernate – зачем использовать «много-к-одному» для представления «один к одному»?

    Скрыть расширения от хрома без нажатия на хромированную панель

    Как предотвратить закрытие диалогового windows при нажатии кнопки

    Нужен минимальный пример загрузки файла Django

    Могу ли я объединить две локальные сети в одну, чтобы получить двойную скорость?

    CFLAGS против CPPFLAGS

    Почему исключение «#include » только иногда приводит к сбоям компиляции?

    Преобразование содержимого: // URI в фактический путь в Android 4.4

    Как я могу манипулировать предварительным просмотром камеры?

    Как периодически проверять подключение к Интернету в целом приложении?

    Установить приложение программно на Android

    Запуск сценария при подключении к беспроводной сети

    adb соединение Wi-Fi, убитого, когда новый USB подключен / отсоединен

    Как печатать на удаленном компьютере с TeamViewer

    Ajax.BeginForm в MVC для загрузки файлов

    Давайте будем гением компьютера.