EIne Datei auf einen Webserver legen kann jeder. Stelle man sich mal den Fall vor, die Zugriffberechtigungen der Datei müssten aber vor der Auslieferung überprüft werden und wir reden hier nicht von einer laschen Base64 Authentifizierung.
Das lässt sich recht komfortabel über ein Servlet realisieren. Denn dieses unterstützt unbekanntermaßen nicht nur HTML oder langweiligen Text sondern ist hervorragend dazu geeigent eine Datei an den Browser zu liefern. Sei es eine Grafik, ein PDF, eine Audiodatei, ein Film… Jedes Format ist möglich. Theoretisch lässt sich an dieser Stelle auf die Performance begrenzen. In Zeiten wo jeder 39 Euro-Netcologne-Nutzer eine 100Mbit Leitung ins Haus gelegt bekommt ist das übrigens gar keine so schlechte Überlegung.
Um eine Datei mittels eines Servlets auszuliefern sollten wir uns zunächst einmal darüber im klaren sein wo wir unsere auszuliefernden Dokumente überhaupt lagern wollen. Der Root-Ordner der Web-Applikation kommt aus Sicherheitsgründen nicht in Frage. Befinden wir uns auf einem fremdadministrierten System ohne Zugriff auf Verzeichnisse außerhalb unserer Applikation und handelt es sich bei den auszuliefernden Daten um Applikationsgebundene Dateien bietet sich das WEB-INF Verzeichnis an. Tomcat lässt von außen keinen Zugriff über den Webbrowser zu. Trotzdem ist der komfortable Zugriff darauf gewährleistet, da die eigene Applikation häufig Zugriff auf das gesamte Dateisystem hat, mindestens jedoch auf sich selbst und ihre Unterverzeichnisse.
Um den absoluten Applikationspfad herauszufinden, in dem ein Servlet ausgeführt wird benötigt man die Methode getServetContext(). Sie gibt uns ein Objekt vom Typ javax.servlet.ServletContext zurück, mit dem wir allerlei über unsere Laufzeitumgebung erfahren können. Mittels der Methode getRealPath() erhalten wir den vollständigen absoluten Pfad unserer Applikation.
Ist der Pfad unserer Dateien bekannt gestaltet sich das Ausliefern einer Datei recht leicht. Es handelt sich hier um einen simplen Kopiervorgang einer Datei in einen Stream. Beim Kopieren einer Datei innerhalb des Dateisystems passiert nichts anderes. Lediglich die Art des Streams hat sich geändert.
In der Regel ist es nicht sinnvoll eine Datei direkt in das WEB-INF Verzeichnis zu legen, da dieses schnell unübersichtlich wird. Stattdessen bietet es sich förmlich an ein Unterverzeichnis für die Lagerung der Dateien zu erstellen. Sind sehr viele Dateien vorhanden oder zumindest in Planung rate ich dazu, die Dateien in folgender Verzeichnisstruktur zu sortieren:
/WEB-INF/webdoc/%Jahr%/%Monat%/%Tag%/
Dieses Vorgehen hat enorme Vorteile was die Performance bei Verzeichnislistings angeht. Sowohl Linux als auch Windows machen in diesem Punkt in der Regel ab ca. 2.000 Dateien pro Verzeichnis erhebliche Probleme.
Bei größeren Umgebungen in denen mehrere Server auf die gleichen Dateien zugreifen müssen, könnte es sich auch als sinnvoll erweisen diese an einem zentralen Speicherort, wie einem gemounteten NFS-Laufwerk, aufzubewahren. Aber gehen wir hier mal der Einfachheit halber davon aus, dass der Speicherort der Dateien bereits geregelt ist.
To be continued…
Diskussion
Keine Kommentare zu “Dateien mit Servlets ausliefern I…”
Post a comment