68 votes

Comment configurer Tomcat pour servir des images à partir d'un dossier externe en dehors des applications Web?

Comment puis-je utiliser Tomcat pour servir des fichiers image d'un dossier public en dehors de webapps? Je ne veux pas utiliser un deuxième serveur de fichiers Apache sur un port différent, car les fichiers image font partie de la même application. Et je ne veux pas créer de lien symbolique vers le dossier public à l'intérieur de webapps puisque mon application est déployée en tant que fichier war. Existe-t-il une solution plus simple, similaire à l'utilisation d'un servlet par défaut pour le contenu statique à l'intérieur de webapps, pour le contenu statique à l'extérieur de webapps?

76voto

delkant Points 362

C'est comme ça que je l'ai fait et ça a bien fonctionné pour moi. Tomcat 7.x

Ajouter un <contexte> à tomcat / conf / server.xml

Exemple gagnant:

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

Exemple Lin:

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

Comme ça:

 <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">
      ...
      <!--HERE THE MAGIC LINE-->
       <Context  docBase="/var/project/images" path="/project/images" />

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

De cette façon, vous devriez pouvoir trouver les fichiers (par exemple /var/project/images/NameOfImage.jpg) sous:

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

28voto

sblundy Points 27163

Vous pourriez avoir une redirection de servlet. En vous web.xml vous auriez:

<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>

Toutes vos images dans "/images", qui serait intercepté par la servlet. Il serait alors lire dans le fichier concerné dans tout ce dossier et de le servir en sortir. Par exemple, disons que vous avez un gif dans votre dossier d'images, c:\Server_Images\smilie.gif. Dans la page web serait <img src="http:/example.com/app/images/smilie.gif".... Dans la servlet, HttpServletRequest.getPathInfo() donnerait "/smilie.gif". Qui la servlet trouverez dans le dossier.

18voto

gamliela Points 619

Dans Tomcat 7, vous pouvez utiliser des "alias" de la propriété. À partir de la docs:

Cet attribut fournit une liste des lieux à l'extérieur à partir de laquelle pour charger les ressources pour ce contexte. La liste des alias doit être de la forme "/aliasPath1=docBase1,/aliasPath2=docBase2" où aliasPathN doit inclure l'un des principaux " / " et docBaseN doit être un chemin absolu, soit un .la guerre de fichier ou à un répertoire. Une ressource sera recherché dans la première docBaseN pour qui aliasPathN est l'un des principaux segments de tracé de la ressource. Si ce n'est pas alias, ensuite, la ressource va être recherché dans la manière habituelle. Ces emplacements ne seront pas vidés si le contexte de l'onu, déployés.

7voto

polarisation Points 163

Vous pouvez déployer un dossier d'images séparément, comme une webapp et de définir l'emplacement du dossier pour être n'importe où dans le système de fichiers.

Créer un Contexte élément dans un fichier XML dans le répertoire $CATALINA_HOME/conf/[enginename]/[hostname]/ où enginename pourrait être "Catalina" et le nom d'hôte peut être 'localhost'.

Nom du fichier basé sur le chemin de l'URL que vous souhaitez que les images soient vues depuis, donc, si votre webapp a path "blog", vous pouvez nommer le fichier XML blog#images.xml et pour que vos images sont visibles à l' example.com/blog/images/

Le contenu du fichier XML doit être <Context docBase="/filesystem/path/to/images"/>

Veillez à ne pas annuler le déploiement de cette webapp, que pouvait supprimer toutes vos images!

3voto

adilei Points 275

Au lieu de configurer Tomcat pour rediriger les requêtes, utilisez Apache comme une interface avec l' Apache Tomcat connecteur de sorte que Apache est uniquement de servir du contenu statique, tout en demandant tomcat pour le contenu dynamique.

À l'aide de la JKmount directive (ou autres), vous pouvez spécifier exactement laquelle les demandes sont envoyées à Tomcat.

Demandes pour du contenu statique, tels que des images, seraient desservis directement par Apache, à l'aide d'un standard configuration d'un hôte virtuel, tandis que d'autres demandes, défini dans le JKMount directive sera envoyé à Tomcat travailleurs.

Je pense que cette mise en œuvre serait de vous donner plus de flexibilité et de contrôle sur l'ensemble de l'application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X