Come configurare Tomcat per pubblicare immagini da una cartella esterna al di fuori di webapps?

In che modo posso utilizzare Tomcat per pubblicare file di immagine da una cartella pubblica esterna alle applicazioni web? Non voglio utilizzare un 2 ° server di file Apache su una porta diversa poiché i file di immagine fanno parte della stessa app. E non voglio creare un link simbolico alla cartella pubblica all’interno di webapps dal momento che la mia app è distribuita come un file di guerra …. Esiste una soluzione più semplice simile all’uso del servlet di default per il contenuto statico all’interno di webapps, per il contenuto statico all’esterno di webapps

    Potresti avere un servlet di reindirizzamento. Nel tuo web.xml avresti:

     images com.example.images.ImageServlet   images /images/*  

    Tutte le tue immagini saranno in “/ images”, che verrebbero intercettate dal servlet. Dovrebbe quindi leggere nel file pertinente in qualsiasi cartella e servirlo nuovamente. Ad esempio, supponiamo di avere una gif nella cartella delle immagini, c: \ Server_Images \ smilie.gif. Nella pagina web sarebbe Nel servlet, HttpServletRequest.getPathInfo() restituirebbe "/smilie.gif". Che il servlet avrebbe trovato nella cartella.

    Questo è il modo in cui l’ho fatto e ha funzionato bene per me. (fatto su Tomcat 7.x)

    Aggiungi un al file tomcat/conf/server.xml .

    Esempio di Windows:

      

    Esempio di Linux:

      

    In questo modo (nel contesto):

      ...  ...  ...  ...       

    In questo modo, dovresti riuscire a trovare i file (ad es. /var/project/images/NameOfImage.jpg ) sotto:

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

    In Tomcat 7, puoi utilizzare la proprietà “alias”. Dai documenti :

    Questo attributo fornisce un elenco di posizioni esterne da cui caricare le risorse per questo contesto. L’elenco degli alias dovrebbe essere nella forma “/ aliasPath1 = docBase1, / aliasPath2 = docBase2” dove aliasPathN deve includere un ‘/’ principale e docBaseN deve essere un percorso assoluto per un file .war o una directory. Una ricerca verrà ricercata nel primo docBaseN per cui aliasPathN è un segmento di percorso principale della risorsa. Se non esiste un alias di questo tipo, la ricerca verrà cercata nel solito modo. Queste posizioni esterne non verranno svuotate se il contesto non è distribuito.

    È ansible distribuire una cartella di immagini come webapp separata e definire la posizione di tale cartella in qualsiasi punto del file system.

    Creare un elemento Context in un file XML nella directory $CATALINA_HOME/conf/[enginename]/[hostname]/ dove il nome motore potrebbe essere ‘Catalina’ e il nome host potrebbe essere ‘localhost’.

    Assegna un nome al file in base all’URL del percorso in cui desideri visualizzare le immagini, quindi se la tua webapp ha percorso “blog”, potresti nominare il blog#images.xml file XML blog#images.xml e in modo che le tue immagini siano visibili su example.com/blog/images/

    Il contenuto del file XML deve essere

    Fai attenzione a non annullare la distribuzione di questa webapp, in quanto ciò potrebbe eliminare tutte le tue immagini!

    Anziché configurare Tomcat per redirect le richieste, utilizzare Apache come front-end con il connettore Apache Tomcat in modo che Apache stia servendo solo contenuto statico, mentre si richiede tomcat per il contenuto dinamico.

    Utilizzando la direttiva JKmount (o altri) è ansible specificare esattamente quali richieste vengono inviate a Tomcat.

    Le richieste di contenuto statico, come le immagini, sarebbero servite direttamente da Apache, utilizzando una configurazione host virtuale standard, mentre altre richieste, definite nella direttiva JKMount, verranno inviate ai lavoratori Tomcat.

    Penso che questa implementazione ti darebbe la massima flessibilità e controllo sull’intera applicazione.

    Dopo che nessuna delle soluzioni basate sulla definizione di XML ha funzionato per me, ho trovato questa risposta molto utile. Ci sono voluti circa un minuto e un piccolo cambiamento di codice: ho modificato questa linea

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

    in

    this.basePath = getInitParameter("basePath");

    Questo è molto semplice e diretto per server il contenuto statico dalla cartella webapps esterna in tomcat.

    Basta modificare il file server.xml sotto $ CATALINA_HOME / config / server.xml come sotto e riavviare il tomcat.

      ****   

    Aggiungi l’elemento di contesto all’interno dell’elemento host con due attributi docBase e percorso.

    1) docBase: rappresenta il percorso della directory del disco rigido 2): rappresenta l’uri su cui si desidera pubblicare il contenuto statico.

    Ad esempio: se hai 7.png nella directory C: \ Ankur \ testFiles puoi accedere al file 7.png come di seguito:

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

    Per maggiori dettagli, controlla il blog

    Molti anni dopo, possiamo fare quanto segue con Spring Web MVC, all’interno del nostro file webapp-servlet.xml :