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
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.
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.
Dies waren die Tage von Tomcat 4. –
Ihren Kommentar lesen Ich habe gerade festgestellt, dass ich einen Link für einige alte Dokumente eingefügt habe. Ich korrigiere das jetzt. – adilei
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/
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!
Das Problem mit dieser Lösung besteht darin, dass Tomcat 5 bis 10 Sekunden benötigt, um Bilder automatisch bereitzustellen. – somid3
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");
Ich war in dem gleichen Fall, aber Ihre Antwort hat mir sehr geholfen, Danke;)! –
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/" />
Soweit ich weiß, funktioniert das nicht, wenn sich der statische Inhalt in einem externen Verzeichnis befindet. – rmoestl
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.
Vorsicht, das funktioniert nicht mehr in Tomcat 8 –
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
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. –
funktioniert auch für Tomcat 6.0.37 !!! – Ankur
Es funktioniert nicht für mich –
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 "%r" %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
- 1. Wie man einen anderen Kontext setzen bis zu einem externen Verzeichnis außerhalb Punkt webapps Tomcat/Java
- 2. Tomcat - Mehrere Webapps-Ordner
- 3. unmöglich zu zeigen Alle Bilder von Tomcat 8 Webapps
- 4. Wie konfiguriere ich Mercurial, um bestimmte Konfigurationsdateien nicht zu übertragen?
- 5. Tomcat: Programm läuft nicht von Webapps
- 6. Tomcat Webapps Verzeichnis in Windows
- 7. Freigabe von Ignite-Instanz über Tomcat Webapps
- 8. wie Eclipse zu machen + tomcat Instant deploy für Webapps
- 9. Wo ist CATALINA_BASE/webapps Ordner für Tomcat 8 auf Mac?
- 10. Wie konfiguriere ich nginx, um try_files aus einem anderen Ordner zu laden?
- 11. Erzeuge WAR-Datei von Tomcat Webapp-Ordner
- 12. Wie übertragen Bilder von Android-Gerät zu Matlab und umgekehrt
- 13. Wie konfiguriere ich Aurelia um Module aus einem Ordner zu laden?
- 14. Wie konfiguriere ich SublimeRepl, um mit einem Hühnerschema zu arbeiten?
- 15. Bilder anzeigen von außerhalb von ASP.NET-Anwendung
- 16. Wie findet Tomcat das webapps-Verzeichnis?
- 17. Wie konfiguriere ich Ladezeitweben mit AspectJ und Tomcat?
- 18. Zugriff auf Ordner außerhalb von webapp
- 19. Um den Wert von der externen Konfiguration zu lesen
- 20. Hinzufügen von externen Ressourcen zum Klassenpfad in Tomcat 8
- 21. Ordner von Wordpress außerhalb des Projekts hochladen
- 22. Wie wird eine Spring-Boot-MVC-Anwendung im traditionellen Tomcat-Webapps-Ordner bereitgestellt?
- 23. Wie schreibe ich eine .htaccess-Datei, so dass sie Bilder außerhalb des Web-Stammverzeichnisses auf einem Apache-Server übertragen kann?
- 24. Übertragen von Änderungen von einem Git Repo zu einem anderen
- 25. Der effizienteste Weg, um Bilder zu einem Silverlight-Client zu übertragen
- 26. Wie bekomme ich JMX-Daten von tomcat Webapps hinter Load Balancer
- 27. Wie kann ich Bilder von einem beliebigen Ordner in Xamarin Forms auf Windows 8 anzeigen
- 28. JavaScript: Wie lade ich alle Bilder in einem Ordner?
- 29. Tipps zum Synchronisieren von Webapps und SVN?
- 30. Maven: WAR in Tomcat webapps Verzeichnis kopieren
glaube ich nicht Ihre Antwort hat deutlich gemacht, genug, dass 'com.example.images.ImageServlet' etwas ist, dass Sie Schreib dich selbst. –
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
Würde dies eine HTTP-Umleitung verursachen? – ebi