Ich habe einige Vorschläge gesehen, wie beispielsweise, dass das Bildverzeichnis ein symbolischer Link ist, der auf ein Verzeichnis außerhalb des Webcontainers verweist. Funktioniert dieser Ansatz jedoch sowohl in Windows- als auch in * nix-Umgebungen?
Wenn Sie die Pfadregeln für das * nix-Dateisystem einhalten (dh Sie verwenden ausschließlich Schrägstriche wie in /path/to/files
), funktioniert dies auch unter Windows, ohne dass Sie mit hässlichen File.separator
Zeichenfolgenverkettungen herumspielen müssen. Es wird jedoch nur auf derselben Arbeitsplatte gescannt, von der aus dieser Befehl aufgerufen wird. Wenn also beispielsweise Tomcat installiert C:
ist, /path/to/files
würde das tatsächlich darauf verweisen C:\path\to\files
.
Wenn sich die Dateien alle außerhalb der Webanwendung befinden und Sie möchten, dass Tomcat DefaultServlet
sie verarbeitet, müssen Sie in Tomcat grundsätzlich das folgende Context-Element zum /conf/server.xml
internen <Host>
Tag hinzufügen :
<Context docBase="/path/to/files" path="/files" />
Auf diese Weise sind sie über zugänglich http://example.com/files/...
. Das GlassFish / Payara-Konfigurationsbeispiel finden Sie hier und das WildFly-Konfigurationsbeispiel finden Sie hier .
Wenn Sie die Kontrolle haben wollen , über das Lesen / Schreiben von Dateien selbst, dann müssen Sie ein schaffen Servlet
für diese , die im Grunde nur eine bekommt InputStream
der Datei im Geschmack von beispielsweise FileInputStream
und schreibt sie in die OutputStream
von derHttpServletResponse
.
In der Antwort sollten Sie den Content-Type
Header so festlegen , dass der Client weiß, welche Anwendung mit der bereitgestellten Datei verknüpft werden soll. Außerdem sollten Sie den Content-Length
Header so einstellen , dass der Client den Download-Fortschritt berechnen kann, da er sonst nicht bekannt ist. Und Sie sollten den Content-Disposition
Header auf setzen, attachment
wenn Sie Speichern unter möchten Dialogfeld , da der Client sonst versucht, ihn inline anzuzeigen. Zum Schluss schreiben Sie einfach den Dateiinhalt in den Antwortausgabestream.
Hier ist ein grundlegendes Beispiel für ein solches Servlet:
@WebServlet("/files/*")
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String filename = URLDecoder.decode(request.getPathInfo().substring(1), "UTF-8");
File file = new File("/path/to/files", filename);
response.setHeader("Content-Type", getServletContext().getMimeType(filename));
response.setHeader("Content-Length", String.valueOf(file.length()));
response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\"");
Files.copy(file.toPath(), response.getOutputStream());
}
}
Wenn Sie url-pattern
beispielsweise einem von zugeordnet sind /files/*
, können Sie es von aufrufen http://example.com/files/image.png
. Auf diese Weise können Sie mehr Kontrolle über die Anforderungen haben als über die Anforderungen DefaultServlet
, z. B. die Bereitstellung eines Standardabbilds (dh if (!file.exists()) file = new File("/path/to/files", "404.gif")
oder so). Auch die Verwendung von request.getPathInfo()
wird oben bevorzugt, request.getParameter()
da es SEO-freundlicher ist und der IE sonst beim Speichern unter nicht den richtigen Dateinamen auswählt .
Sie können dieselbe Logik zum Bereitstellen von Dateien aus der Datenbank wiederverwenden. Ersetzen Sie einfach new FileInputStream()
durch ResultSet#getInputStream()
.
Hoffe das hilft.
Siehe auch:
<Context docBase="/path/to/images" path="/images" />
in Windows, aber Pfad relativ zum Webapps-Ordner erhalten:C:\install\apache-tomcat-8.0.26\webapps\tmp] is not valid
<Context docBase="C:\tmp\" path="/images" />
HTTP Status 404 - /images/
wennhttp://localhost:8080/images/
tmp
http://localhost:8080/images/Tulips.jpg
Sie können dies tun, indem Sie Ihre Bilder auf einen festen Pfad setzen (zum Beispiel: / var / images oder c: \ images), eine Einstellung in Ihren Anwendungseinstellungen hinzufügen (in meinem Beispiel durch die Settings.class dargestellt) und sie laden so, in einem
HttpServlet
von Ihnen:Oder wenn Sie das Bild bearbeiten möchten:
dann wäre der HTML-Code
<img src="imageServlet?imageName=myimage.png" />
Natürlich sollten Sie daran denken, verschiedene Inhaltstypen bereitzustellen - "image / jpeg", zum Beispiel basierend auf der Dateierweiterung. Außerdem sollten Sie etwas Caching bereitstellen.
Darüber hinaus können Sie dieses Servlet für die Qualitätsskalierung Ihrer Bilder verwenden, indem Sie Breiten- und Höhenparameter als Argumente angeben und unter
image.getScaledInstance(w, h, Image.SCALE_SMOOTH
Berücksichtigung der Leistung verwenden.quelle
Zur server.xml hinzufügen:
Aktivieren Sie den Parameter für die Auflistung der Verzeichnisdateien in web.xml:
quelle
Voraussetzung: Zugriff auf die statischen Ressourcen (Bilder / Videos usw.) von außerhalb des WEBROOT-Verzeichnisses oder von der lokalen Festplatte
Schritt 1:
Erstellen Sie einen Ordner unter den Webanwendungen des Tomcat-Servers. Angenommen, der Ordnername lautet myproj
Schritt 2:
Erstellen Sie unter myproj einen WEB-INF-Ordner, unter dem Sie eine einfache web.xml erstellen
Code unter web.xml
Verzeichnisstruktur für die beiden oben genannten Schritte
Schritt 3:
Erstellen Sie nun eine XML-Datei mit dem Namen myproj.xml unter dem folgenden Speicherort
CODE in myproj.xml:
Schritt 4:
4 A) Erstellen Sie nun einen Ordner mit dem Namen myproj im Laufwerk E Ihrer Festplatte und erstellen Sie einen neuen
Ordner mit Namensbildern und legen Sie einige Bilder im Bilderordner ab
(e:myproj\images\)
Nehmen wir an, myfoto.jpg steht unter
e:\myproj\images\myfoto.jpg
4 B) Erstellen Sie nun einen Ordner mit dem Namen WEB-INF in
e:\myproj\WEB-INF
und erstellen Sie eine web.xml im Ordner WEB-INFCode in web.xml
Schritt 5:
Erstellen Sie nun ein HTML-Dokument mit dem Namen index.html und platzieren Sie es unter e: \ myproj
CODE unter index.html Willkommen bei Myproj
Die Verzeichnisstruktur für die obigen Schritte 4 und 5 ist wie folgt
Schritt 6:
Starten Sie nun den Apache Tomcat Server
Schritt 7:
Öffnen Sie den Browser und geben Sie die URL wie folgt ein
Dann zeigen Sie den Inhalt an, der in index.html bereitgestellt wird
Schritt 8:
Zugriff auf die Bilder unter Ihrer lokalen Festplatte (außerhalb von Webroot)
quelle
Dies ist eine Geschichte von meinem Arbeitsplatz:
- Wir versuchen, mit Struts 1 und Tomcat 7.x mehrere Bilder und Dokumentdateien hochzuladen.
- Wir versuchen, hochgeladene Dateien in das Dateisystem, den Dateinamen und den vollständigen Pfad zu den Datenbankeinträgen zu schreiben.
- Wir versuchen, Dateiordner außerhalb des Web-App-Verzeichnisses zu trennen . (*)
Die folgende Lösung ist ziemlich einfach und effektiv für die Anforderung (*):
In einer Datei
META-INF/context.xml
mit folgendem Inhalt: (Beispiel: Meine Anwendung wird ausgeführt unterhttp://localhost:8080/ABC
, meine Anwendung / mein Projekt heißtABC
). (Dies ist auch der vollständige Inhalt der Dateicontext.xml
)(funktioniert mit Tomcat Version 7 oder höher)
Ergebnis: Wir haben 2 Alias erstellt. Zum Beispiel speichern wir Bilder unter:
D:\images\foo.jpg
und zeigen sie über einen Link an oder verwenden das Bild-Tag:oder
(Ich benutze Netbeans 7.x, Netbeans scheinen automatisch eine Datei zu erstellen
WEB-INF\context.xml
)quelle
Wenn Sie bis zum Versand entscheiden,
FileServlet
dann müssen Sie auchallowLinking="true"
incontext.xml
ermöglichen , umFileServlet
die Symlinks zu durchqueren.Siehe http://tomcat.apache.org/tomcat-6.0-doc/config/context.html
quelle
Wenn jemand sein Problem mit einer akzeptierten Antwort nicht lösen kann, beachten Sie die folgenden Überlegungen:
localhost:<port>
mit<img> src
Attribut zu erwähnen .context docBase
einen eigenen Eintrag in der lokalenserver.xml
Datei erstellt.quelle
Lesen Sie den InputStream einer Datei und schreiben Sie ihn in,
ServletOutputStream
um Binärdaten an den Client zu senden.src
Führen Sie die URL direkt zum Attibute.quelle
Wenn Sie mit JAX-RS (z. B. RESTEasy) arbeiten möchten, versuchen Sie Folgendes:
mit
javax.ws.rs.core.Response
undcom.google.common.io.ByteStreams
quelle
Ich habe es noch einfacher gemacht. Problem: Eine CSS-Datei hatte URL-Links zum Ordner img. Erhält 404.
Ich habe mir die URL http: // tomcatfolder: port / img / blablah.png angesehen , die nicht existiert. Aber das deutet wirklich auf die ROOT-App in Tomcat hin.
Also habe ich einfach den img-Ordner von meiner Webanwendung in diese ROOT-App kopiert. Funktioniert!
Natürlich nicht für die Produktion empfohlen, aber dies ist für eine interne Tool-Entwickler-App.
quelle