2009-01-06 12 views
56

Wie kann ich mit Tomcat Image-Dateien aus einem öffentlichen Ordner außerhalb von Webapps bereitstellen? Ich möchte keinen zweiten Apache-Fileserver an einem anderen Port verwenden, da die Bilddateien Teil derselben App sind. Und ich möchte keinen Symlink zum öffentlichen Ordner innerhalb von Webapps erstellen, da meine App als WAR-Datei bereitgestellt wird. Gibt es eine einfachere Lösung ähnlich der Verwendung von Standard-Servlet für statischen Inhalt in Webapps, für statischen Inhalt außerhalb von WebappsWie konfiguriere ich Tomcat, um Bilder von einem externen Ordner außerhalb von Webapps zu übertragen?

Antwort

27

Sie könnten ein Redirect-Servlet haben. In Ihrem web.xml würden Sie haben:

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

Alle Ihre Bilder in "/ images" wäre, die von der Servlet abgefangen werden würde. Es würde dann in der entsprechenden Datei in welchem ​​Ordner auch immer lesen und es gleich wieder ausliefern. Angenommen, Sie haben ein Bild in Ihrem Bilderordner, c: \ Server_Images \ smilie.gif. In der Webseite wäre <img src="http:/example.com/app/images/smilie.gif".... Im Servlet würde HttpServletRequest.getPathInfo() "/smilie.gif" ergeben. Was das Servlet im Ordner finden würde.

+39

glaube ich nicht Ihre Antwort hat deutlich gemacht, genug, dass 'com.example.images.ImageServlet' etwas ist, dass Sie Schreib dich selbst. –

+2

Antwort ist ähnlich wie das FileServlet hier - http://balusc.blogspot.com/2007/07/fileservlet.html. Eine gründliche Lösung und eine informative Seite, also bin ich mit dabei. – mikato

+0

Würde dies eine HTTP-Umleitung verursachen? – ebi

3

Anstatt Tomcat zum Umleiten von Anfragen zu konfigurieren, verwenden Sie Apache als Frontend mit der Apache Tomcat connector, so dass Apache nur statische Inhalte bereitstellt und Tomcat nach dynamischen Inhalten fragt.

Mit der JKmount-Direktive (oder anderen) können Sie genau angeben, welche Anfragen an Tomcat gesendet werden.

Anforderungen für statischen Inhalt wie Bilder werden direkt von Apache über eine standardmäßige virtuelle Hostkonfiguration geliefert, während andere Anforderungen, die in der JKMount-Direktive definiert sind, an Tomcat-Mitarbeiter gesendet werden.

Ich denke, diese Implementierung würde Ihnen die größte Flexibilität und Kontrolle über die gesamte Anwendung geben.

+0

Dies waren die Tage von Tomcat 4. –

+0

Ihren Kommentar lesen Ich habe gerade festgestellt, dass ich einen Link für einige alte Dokumente eingefügt habe. Ich korrigiere das jetzt. – adilei

6

Sie können einen Bilderordner als separate Webanwendung bereitstellen und den Speicherort dieses Ordners an einer beliebigen Stelle im Dateisystem definieren.

erstellen Context Element in einer XML-Datei in dem Verzeichnis $CATALINA_HOME/conf/[enginename]/[hostname]/ wo EngineName- sein könnte ‚Catalina‘ und Host-Name könnte ‚localhost‘ wird.

Benennen Sie die Datei auf der Grundlage der Pfad URL Sie die Bilder wollen aus gesehen werden, also, wenn Ihr Webapp Pfad ‚Blog‘ hat, können Sie die XML-Datei blog#images.xml benennen und damit Ihre Bilder würden bei example.com/blog/images/

sichtbar sein

Der Inhalt der XML-Datei sollte <Context docBase="/filesystem/path/to/images"/>

sein. Achten Sie darauf, diese Webanwendung nicht zu deimplementieren, da dies alle Ihre Bilder löschen könnte!

+0

Das Problem mit dieser Lösung besteht darin, dass Tomcat 5 bis 10 Sekunden benötigt, um Bilder automatisch bereitzustellen. – somid3

1

Nachdem keine der Lösungen, die auf der Definition von XML basierten, für mich funktionierte, fand ich this answer sehr hilfreich.Es dauerte etwa eine Minute, und eine kleine Codeänderung: ich diese Linie

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

in

this.basePath = getInitParameter("basePath");

+0

Ich war in dem gleichen Fall, aber Ihre Antwort hat mir sehr geholfen, Danke;)! –

-1

Viele Jahre später, können wir die folgenden mit Spring Web MVC tun, in unserem webapp-servlet.xml Datei:

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

Soweit ich weiß, funktioniert das nicht, wenn sich der statische Inhalt in einem externen Verzeichnis befindet. – rmoestl

18

In Tomcat 7 können Sie "Aliase" Eigenschaft verwenden. Von docs:

Dieses Attribut enthält eine Liste externer Speicherorte, aus denen Ressourcen für diesen Kontext geladen werden können. Die Liste der Aliase sollte das Format "/ aliasPath1 = docBase1,/aliasPath2 = docBase2" haben, wobei aliasPathN ein führendes '/' enthalten muss und docBaseN ein absoluter Pfad zu einer WAR-Datei oder einem Verzeichnis sein muss. Eine Ressource wird in der ersten docBaseN gesucht, für die aliasPathN ein führendes Pfadsegment der Ressource ist. Wenn es keinen solchen Alias ​​gibt, wird die Ressource auf die übliche Weise durchsucht. Diese externen Speicherorte werden nicht geleert, wenn der Kontext nicht bereitgestellt wird.
+0

Vorsicht, das funktioniert nicht mehr in Tomcat 8 –

55

So habe ich es gemacht und es hat gut für mich funktioniert. (erfolgt mit Tomcat 7.x)

Fügen Sie der Datei tomcat/conf/server.xml eine <context> hinzu.

Beispiel für Windows:

Linux Beispiel:

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

wie folgt aus (in context):

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

Auf diese Weise sollten Sie in der Lage sein, die Dateien zu finden (zB /var/project/images/NameOfImage.jpg) unter:

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

Das funktionierte perfekt für mich mit Tomcat 7 unter Windows Server 2008. Es war auch bei weitem die einfachste Lösung, die ich fand. Wenn Sie den Tomcat-Manager verwenden, wird der Wert des Attributs "path" des Elements "Context" als laufende Anwendung angezeigt. Danken. –

+1

funktioniert auch für Tomcat 6.0.37 !!! – Ankur

+1

Es funktioniert nicht für mich –

0

Dies ist sehr einfach und unkompliziert, um den statischen Inhalt von außerhalb Webapps-Ordner in Tomcat Server.

Bearbeiten Sie einfach die server.xml unter $ CATALINA_HOME/config/server.xml wie unten und starten Sie den Tomcat neu.

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

Fügen Sie das Kontextelement innerhalb des Hostelements mit zwei Attributen docBase und path hinzu.

1) DocBase: die Festplatte Verzeichnis 2) Pfad darstellt: stellt die uri auf den Sie die statischen Inhalte dienen wollen.

Zum Beispiel: Wenn Sie 7.png im Verzeichnis C: \ Ankur \ testFiles haben, können Sie auf die 7 zugreifen.png-Datei wie folgt:

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

Weitere Informationen erhalten Sie im blog

Verwandte Themen