Как в конфигурации Tomcat, чтобы служить изображения из внешней папки за пределами веб-приложений?


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

8 63

8 ответов:

у вас может быть сервлет перенаправления. В тебе паутина.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() даст "/смайл.файл GIF." Который сервлет найдет в папка.

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

добавить <context> до .

пример 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 

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

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

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

создать контекст элемент в 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"/>

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

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

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

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

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

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

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

на

this.basePath = getInitParameter("basePath");

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

просто отредактируйте сервер.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

для получения более подробной информации, проверьте блог

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

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