Как настроить Tomcat для обслуживания изображений из внешней папки вне webapps?

Как я могу использовать Tomcat для работы с файлами изображений из общей папки вне webapps? Я не хочу использовать 2-й файловый сервер Apache на другом порту, так как файлы изображений являются частью одного и того же приложения. И я не хочу создавать символическую ссылку на общую папку внутри webapps, так как мое приложение развернуто как военный файл... Есть ли более простое решение, подобное использованию сервлета по умолчанию для статического содержимого внутри webapps, для статического контента вне внешних webapps

Ответ 1

У вас может быть сервлет перенаправления. В вашем web.xml у вас будет:

<servlet>
    <servlet-name>images</servlet-name>
    <servlet-class>com.example.images.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>images</servlet-name>
    <url-pattern>/images/*</url-pattern>
</servlet-mapping>

Все ваши изображения будут в "/images", которые будут перехвачены сервлетом. Затем он будет считываться в соответствующем файле в любой папке и немедленно возвращать его. Например, скажем, у вас есть gif в папке с изображениями, c:\Server_Images\smilie.gif. На веб-странице будет <img src="http:/example.com/app/images/smilie.gif".... В сервлет, HttpServletRequest.getPathInfo() даст "/smilie.gif". Какой сервлет найдет в папке.

Ответ 2

Так я и сделал, и это сработало для меня. (сделано на Tomcat 7.x)

Добавьте <context> в файл tomcat/conf/server.xml.

Пример Windows:

<Context docBase="c:\Documents and Settings\The User\images" path="/project/images" />

Пример Linux:

<Context docBase="/var/project/images" path="/project/images" />

Подобно этому (в контексте):

<Server port="8025" shutdown="SHUTDOWN">
 ...
  <Service name="Catalina">
    ...
    <Engine defaultHost="localhost" name="Catalina">
     ...
     <Host appBase="webapps"
      autoDeploy="false" name="localhost" unpackWARs="true"
      xmlNamespaceAware="false" xmlValidation="false">
      ...
      <!--MAGIC LINE GOES HERE-->
       <Context  docBase="/var/project/images" path="/project/images" />

      </Host>
    </Engine>
  </Service>
</Server>

Таким образом, вы должны найти файлы (например, /var/project/images/NameOfImage.jpg) в разделе:

http://localhost:8080/project/images/NameOfImage.jpg 

Ответ 3

В Tomcat 7 вы можете использовать свойство "aliases". Из docs:

Этот атрибут предоставляет список внешних местоположений, из которых можно загрузить ресурсы для этого контекста. Список псевдонимов должен иметь форму "/aliasPath1 = docBase1,/aliasPath2 = docBase2", где aliasPathN должен включать в себя ведущий "/", а docBaseN должен быть абсолютным путем либо к файлу .war, либо к каталогу. Ресурс будет искать в первом docBaseN, для которого aliasPathN является ведущим сегментом пути ресурса. Если такого псевдонима нет, тогда ресурс будет обыскаться обычным способом. Эти внешние местоположения не будут опустошены, если контекст не развернут.

Ответ 4

Вы можете развернуть папку изображений в виде отдельного webapp и определить расположение этой папки в любом месте файловой системы.

Создать элемент контекста в файле XML в каталоге $CATALINA_HOME/conf/[enginename]/[hostname]/ где enginename может быть "Catalina", а имя хоста может быть "localhost".

Назовите файл на основе URL-адреса пути, с которого вы хотите просматривать изображения, поэтому, если ваш веб-сайт имеет путь "блог", вы можете назвать XML файл blog#images.xml и чтобы ваши изображения были видны в example.com/blog/images/

Содержимое XML файла должно быть <Context docBase="/filesystem/path/to/images"/>

Будьте осторожны, чтобы не развернуть этот webapp, поскольку это может удалить все ваши изображения!

Ответ 5

Вместо того, чтобы настраивать Tomcat для перенаправления запросов, используйте Apache в качестве интерфейса с Apache Tomcat, чтобы Apache обслуживал только статический контент, при запросе tomcat для динамического содержимого.

Используя директиву JKmount (или другие), вы можете точно указать, какие запросы отправляются Tomcat.

Запросы на статический контент, например изображения, будут обслуживаться непосредственно Apache, используя стандартную конфигурацию виртуального хоста, а другие запросы, определенные в директиве JKMount, будут отправлены работникам Tomcat.

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

Ответ 6

После того, как ни один из решений, основанных на определении XML файлов, не работал у меня, я нашел этот ответ очень полезным. Потребовалось около минуты и небольшое изменение кода: я изменил эту строку

this.basePath = getServletContext().getRealPath(getInitParameter("basePath"));

в

this.basePath = getInitParameter("basePath");

Ответ 7

Это очень просто и прямо на сервере статический контент из внешней папки webapps в tomcat.

Просто отредактируйте файл server.xml под $CATALINA_HOME/config/server.xml, как показано ниже, и перезапустите tomcat.

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        **<Context docBase="C:\Ankur\testFiles"  path="/companyLogo" />**

       <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

</Host>

Добавить элемент контекста внутри элемента хоста с двумя атрибутами docBase и path.

1) docBase: представляет каталог жесткого диска 2) путь: представляет uri, на котором вы хотите обслуживать статический контент.

Например: если у вас есть 7.png внутри каталога C:\Ankur\testFiles, вы можете получить доступ к файлу 7.png, как показано ниже:

http://localhost:8081/companyLogo/7.png

Подробнее см. blog

Ответ 8

Много лет спустя мы можем сделать следующее с Spring веб-MVC, внутри нашего файла webapp-servlet.xml:

<mvc:resources mapping="/static/**" location="/static/" />