Da die Java Servlet Technologie keine Unterstützung des Encryption Type "multipart/form-data" (Upload von Inhalten) enthält, habe ich mir vor ein paar Jahren diese Bibliothek geschrieben, die die Verwendung dieses Typs ermöglicht.
Ursprünglich lehnte sich das Ganze stark an die entsprechende Bibliothek von Jason Hunter an (daher auch die gleichen Klassennamen), allerdings habe ich nach Durchsicht des RFC 1867 das Ganze noch einmal programmiert (unter Beibehaltung der Klassennamen). Über die Jahre habe ich dann auch einige kleinere Fehler in der ursprünglichen Implementierung ausgeräumt (z.B. gab es in der Ursprungsversion - ich meine, auch bei Jason Hunter - Fehler, wenn im Formular Selektionslisten mit Mehrfachauswahl verwendet wurden). Außerdem habe ich die Anpassung an neuere Java-Servlet-Spezifikationen vorgenommen (derzeit 1.3).
Die Verwendung der Klassen ist relativ einfach. Die Klasse
lindhorst.servlet.http.MultipartRequest
implementiert das Interface
javax.servlet.http.HttpServletRequest
. Der
Konstruktor der Klasse nimmt die ursprünglich vom
Servlet-Container gelieferte Implementierung von
javax.servlet.http.HttpServletRequest
entgegen und
stellt einen Wrapper für diesen dar, mit dem dann
zusätzliche Informationen über Uploads dem Request
entnommen werden können. Wichtig dabei ist, dass die
Instanzierung von MultipartRequest
stattfindet,
bevor irgendwelche anderen Zugriffe auf den ursprünglichen
HttpServletRequest
vorgenommen werden.
Normale Parameter können wie gewohnt über die
Methode getParameter(java.lang.String)
ausgelesen
werden, da MultipartRequest
ja
HttpServletRequest
implementiert. Um hochgeladene
Inhalte auszulesen, muss stattdessen die Methode
getParameterContent(java.lang.String)
verwendet
werden, die ein byte Array (byte[]
)
zurückliefert.
Um programmatisch herauszufinden, welche Parameter im Request
vorhanden sind und ob es sich dabei um "normale" oder
Upload-Parameter handelt, können die Methoden
getParameterMap()
,
isNormalParameter(java.lang.String)
und
isContentParameter(java.lang.String)
respektive
benutzt werden.
public void doPost(HttpServletRequest request, HttpServletResponse) throws IOException, ServletException { MultipartRequest multipart=new MultipartRequest(request); byte[] buffer=null; if(multipart.isContentParameter("uploaded")) { buffer=multipart.getParameterContent("uploaded"); } else { return; } //do something with "buffer" ... }
Eine beispielhafte Webanwendung liegt der Library bei, sie
kann mit ant buildclientWAR
erstellt werden. Das
dadurch erstellte Web-Archiv im Unterverzeichnis
dist
kann in einen Servlet-Container geladen werden.
Die Quellen dieser Anwendung befinden sich im Unterverzeichnis
src
im Paket
lindhorst.multipart.webclient
sowie im
Unterverzeichnis webclient
. Dieses Beispiel nimmt
eine hochgeladene Datei entgegen und sendet die Inhalte an den
Client zurück. Dabei wird untersucht, ob der Client diese
Inhalte direkt anzeigen kann (Untersuchung des Headers "Accept"),
ansonsten wird der Antwort der ursprüngliche Dateiname
beigefügt, wodurch die meisten Browser eine "Speichern
unter"-Box öffnen.
Die Beispielanwendung kann hier ausprobiert werden.
Die Dokumenation wird bei der Installation automatisch generiert. Sie kann aber auch hier eingesehen werden.