meaning - tomcat truss
¿Cómo configurar Tomcat para servir imágenes desde una carpeta externa fuera de webapps? (8)
¿Cómo puedo usar Tomcat para servir archivos de imagen de una carpeta pública fuera de webapps? No quiero usar un segundo servidor de archivos Apache en un puerto diferente ya que los archivos de imagen son parte de la misma aplicación. Y no quiero crear un enlace simbólico a la carpeta pública dentro de webapps ya que mi aplicación se implementa como un archivo war ... ¿Existe una solución más simple similar al uso de servlet predeterminado para contenido estático dentro de webapps, para contenido estático fuera de webapps?
Después de que ninguna de las soluciones basadas en la definición de XML funcionó para mí, encontré esta respuesta muy útil. Tomó alrededor de un minuto y un pequeño cambio de código: modifiqué esta línea
this.basePath = getServletContext().getRealPath(getInitParameter("basePath"));
dentro
this.basePath = getInitParameter("basePath");
En Tomcat 7, puede usar la propiedad "alias". De los docs :
Este atributo proporciona una lista de ubicaciones externas desde las cuales cargar recursos para este contexto. La lista de alias debe tener la forma "/ aliasPath1 = docBase1, / aliasPath2 = docBase2" donde aliasPathN debe incluir un ''/'' inicial y docBaseN debe ser una ruta absoluta a un archivo .war o a un directorio. Se buscará un recurso en el primer docBaseN para el que aliasPathN es un segmento de ruta principal del recurso. Si no existe ese alias, se buscará el recurso de la forma habitual. Estas ubicaciones externas no se vaciarán si el contexto no está desplegado.
En lugar de configurar Tomcat para redirigir las solicitudes, utilice Apache como interfaz con el conector Apache Tomcat para que Apache solo sirva contenido estático, mientras le pide a Tomcat contenido dinámico.
Usando la directiva JKmount (u otras) puede especificar exactamente qué solicitudes se envían a Tomcat.
Las solicitudes de contenido estático, como las imágenes, serían atendidas directamente por Apache, utilizando una configuración de host virtual estándar, mientras que otras solicitudes, definidas en la directiva JKMount, se enviarán a los trabajadores de Tomcat.
Creo que esta implementación le daría la mayor flexibilidad y control en la aplicación general.
Esta es la forma en que lo hice y funcionó bien para mí. (hecho en Tomcat 7.x)
Agregue un <context>
al archivo tomcat/conf/server.xml
.
Ejemplo de Windows:
<Context docBase="c:/Documents and Settings/The User/images" path="/project/images" />
Ejemplo de Linux:
<Context docBase="/var/project/images" path="/project/images" />
Me gusta esto (en contexto):
<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>
De esta forma, debería poder encontrar los archivos (por ejemplo /var/project/images/NameOfImage.jpg
) en:
http://localhost:8080/project/images/NameOfImage.jpg
Esto es muy simple y directo para server el contenido estático de la carpeta webapps externa en tomcat.
Simplemente edite server.xml en $ CATALINA_HOME / config / server.xml como se muestra a continuación y reinicie el 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 "%r" %s %b" />
</Host>
Agregue el elemento de contexto dentro del elemento host con dos atributos docBase y ruta.
1) docBase: representa el directorio del disco duro 2) ruta: representa el uri en el que desea servir el contenido estático.
Por ejemplo: si tiene 7.png dentro del directorio C: / Ankur / testFiles, puede acceder al archivo 7.png como se muestra a continuación:
http://localhost:8081/companyLogo/7.png
Para más detalles, mira el blog
Muchos años después, podemos hacer lo siguiente con Spring Web MVC, dentro de nuestro archivo webapp-servlet.xml
:
<mvc:resources mapping="/static/**" location="/static/" />
Podría tener un servlet de redirección. En tu web.xml, tendrías:
<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>
Todas sus imágenes estarían en "/ images", que serían interceptadas por el servlet. Luego leería en el archivo relevante en cualquier carpeta y la publicaría de nuevo. Por ejemplo, supongamos que tienes un gif en tu carpeta de imágenes, c: / Server_Images / smilie.gif. En la página web sería <img src="http:/example.com/app/images/smilie.gif"...
En el servlet, HttpServletRequest.getPathInfo()
arrojaría "/smilie.gif". Que el servlet encontraría en la carpeta.
Puede implementar una carpeta de imágenes como una aplicación web separada y definir la ubicación de esa carpeta para que esté en cualquier parte del sistema de archivos.
Cree un elemento de contexto en un archivo XML en el directorio $CATALINA_HOME/conf/[enginename]/[hostname]/
donde el nombre de la página pueda ser ''Catalina'' y el nombre de host sea ''localhost''.
Asigne un nombre al archivo en función de la URL de ruta desde la que desea que se vean las imágenes, de modo que si su aplicación web tiene la ruta ''blog'', puede blog#images.xml
nombre al archivo XML del blog#images.xml
para que las imágenes estén visibles en example.com/blog/images/
El contenido del archivo XML debe ser <Context docBase="/filesystem/path/to/images"/>
¡Tenga cuidado de no anular el despliegue de esta aplicación web, ya que podría eliminar todas sus imágenes!