web-dev-qa-db-fra.com

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 à partir 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 car mon application est déployée en tant que fichier war.

65
Sathish

Vous pourriez avoir un servlet de redirection. Dans votre 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 seraient dans "/ images", qui seraient interceptées par le servlet. Il lirait ensuite le fichier correspondant dans un dossier quelconque et le retransmettrait immédiatement. Par exemple, disons que vous avez un gif dans votre dossier 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". Ce que la servlet trouverait dans le dossier.

28
sblundy

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

Ajoutez un <context> au fichier Tomcat/conf/server.xml.

Exemple Windows:

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

Exemple Linux:

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

Comme ceci (dans le contexte):

<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 cette manière, vous devriez pouvoir trouver les fichiers (par exemple /var/project/images/NameOfImage.jpg) sous:

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

Dans Tomcat 7, vous pouvez utiliser la propriété "alias". De la docs :

Cet attribut fournit une liste d'emplacements externes à partir desquels charger des ressources pour ce contexte. La liste des alias doit être de la forme "/ aliasPath1 = docBase1,/aliasPath2 = docBase2" où aliasPathN doit inclure un '/' principal et docBaseN doit être un chemin absolu vers un fichier .war ou un répertoire. Une ressource sera recherchée dans le premier docBaseN pour lequel aliasPathN est un segment de chemin principal de la ressource. S'il n'y a pas un tel alias, alors la ressource sera recherchée de la manière habituelle. Ces emplacements externes ne seront pas vidés si le contexte n'est pas déployé .
18
gamliela

Vous pouvez déployer un dossier d'images en tant qu'application Web distincte et définir l'emplacement de ce dossier pour qu'il soit situé n'importe où dans le système de fichiers.

Créez un élément Context dans un fichier XML du répertoire $CATALINA_HOME/conf/[enginename]/[hostname]/ Où nom_moteur pourrait être 'Catalina' et nom_hôte pourrait être 'localhost'.

Nommez le fichier en fonction de l'URL du chemin à partir duquel vous voulez que les images soient visionnées. Ainsi, si votre application Web a le chemin 'blog', vous pouvez nommer le fichier XML blog#images.xml et afficher vos images à 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 application Web, car cela pourrait supprimer toutes vos images!

7
Justin Emery

Au lieu de configurer Tomcat pour rediriger les demandes, utilisez Apache comme interface avec le connecteur Apache Tomcat afin qu'Apache ne serve que du contenu statique, tout en demandant à Tomcat un contenu dynamique.

En utilisant la directive JKmount (ou d’autres), vous pouvez spécifier exactement les requêtes envoyées à Tomcat.

Les demandes de contenu statique, telles que des images, seraient directement traitées par Apache, à l'aide d'une configuration d'hôte virtuel standard, tandis que les autres demandes, définies dans la directive JKMount, seraient envoyées aux travailleurs Tomcat.

Je pense que cette implémentation vous donnerait le plus de flexibilité et de contrôle sur l’application globale.

3
adilei

Aucune solution n’ayant fonctionné pour moi, j’ai trouvé cette réponse très utile. A pris environ une minute et un petit changement de code: j'ai modifié cette ligne

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

dans

this.basePath = getInitParameter("basePath");

1
Yossi Shasho

Ceci est très simple et direct pour le serveur le contenu statique de l'extérieur du dossier webapps dans Tomcat.

Editez simplement le fichier server.xml sous $ CATALINA_HOME/config/server.xml comme ci-dessous et redémarrez 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>

Ajoutez l'élément de contexte à l'intérieur de l'élément Host avec deux attributs docBase et path. 

1) docBase: représente le répertoire du disque dur 2) chemin: représente l'URI sur lequel vous souhaitez diffuser le contenu statique.

Par exemple: Si vous avez 7.png dans le répertoire C:\Ankur\testFiles, vous pouvez accéder au fichier 7.png comme ci-dessous:

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

Pour plus de détails, consultez le blog

0
Ankur jain