Multipart Request Library

Download

Gegenstand der Library

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

Verwendung der Library

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.

Codebeispiel

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.

Javadoc Dokumentation

Die Dokumenation wird bei der Installation automatisch generiert. Sie kann aber auch hier eingesehen werden.