KenntWas.de – Technische Tipps

Technische Informationen zu Linux, (Oracle-) Datenbanken und mehr

File Upload mit Java und Apache-Commons

| 0 comments

Einen robusten Datei Upload für einen (Web-) Server zu implementieren ist gar nicht so einfach, wie man eigentlich denkt. Es gibt dabei eine Menge zu beachten. Für J2EE-Server stellt Apache-Commons ein eigenes Projekt für diese Aufgabe bereit.

Die Library kümmert sich um Probleme wie

  • multipart/form-data
  • Mime Types
  • Parsen des Requests
  • temporäre Dateien (und das Aufräumen, was von den Entwicklern gerne vergessen wird)
  • Upload in Memory (ohne temp. Dateien) bei kleineren Dateien. Autom. Umschalten auf File-Modus, wenn die Datei zu groß ist.
  • Streamen in eine Datenbank
  • Get-Methoden für Informationen über den Upload (Filesize, Filename, Filetype)
  • FileUpLoad unterstützt sogar die Interaktion mit Viren-Scannern
  • Begrenzung der max. übertragbaren Dateigröße (Sicherheit)

Wie funktioniert der File Upload?

HTML-Formular auf dem Client

Ausgangspunkt ist ein HTML-Formular nach RFC 1867.

<FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST>
    Datei: <INPUT NAME="userfile1" TYPE="file"/>
    Kommentar: <INPUT TYPE=text" name="comment" length="10"/>
    <INPUT TYPE="submit" VALUE="Send File"/>
</FORM>

Der Browser startet eine Dateiauswahl, öffnet die Datei von der (lokalen) Festplatte, kodiert  (encode) die Datei und schickt sie zusammen mit den anderen Variablen (z.B. einem Kommentar) als multipart/form-data an den Server (POST-Methode).
Dort wird der Request geschickt einem Servlet in Empfang genommen.

Decoding auf dem Server

Die weitere Verarbeitung erfolgt dann (mit Java) im Server.
Hier wird der Request zunächst dekodiert.  Die auch im Request enthaltene Datei muß dekodiert und verarbeitet werden.

Die vom Brower geschickten Daten sehen z.B. so aus:

      Content-type: multipart/form-data, boundary=AaB03x

        --AaB03x
        content-disposition: form-data; name="comment"

        Dies ist ein Kommentar
        --AaB03x
        content-disposition: form-data; name="userfile1"; filename="file1.txt"
        Content-Type: text/plain

         ... Inhalt von of file1.txt ...
        --AaB03x--

Verarbeitung

Die Verarbeitung erfolgt dann in einer Schleife

// Process the uploaded items
Iterator iter = items.iterator();
    while (iter.hasNext()) {
        FileItem item = (FileItem) iter.next();
 
        if (item.isFormField()) {
            // 'normales Formularfeld (z.B. comment)
 
            String name = item.getFieldName();
            String value = item.getString();
            ...
    } else {
        // Inhalt der Datei verarbeiten /z.B. userfile1
        String fieldName = item.getFieldName();
        String fileName = item.getName();
        String contentType = item.getContentType();
        boolean isInMemory = item.isInMemory();
        long sizeInBytes = item.getSize();
        ...
    }
}

Natürlich kann der Request auch in anderen Sprachen (z.B. php) verarbeitet werden.

Weitere nützliche Apache Commons Komponenten

Components
AttributesRuntime API für metadata Attribute wie doclet tags.
BeanUtilsEasy-to-use wrappers für die Java reflection und introspection APIs.
BetwixtServices zum Mappen von JavaBeans auf XML Dokumente (und zurück).
ChainChain of Responsibility pattern implemention.
CLICommand Line Argumente parsen.
CodecGenerellle encoding/decoding Algorithmen (z.B. example phonetic, base64, URL).
CollectionsExtends or augments the Java Collections Framework.
CompressKompressions-API (tar, zip und bzip2 Dateien).
ConfigurationLesen von Konfigurations-/Preferences Dateien in unterschiedlichen Formaten.
DaemonAlternative invocation mechanism for unix-daemon-like java code.
DBCPDatabase connection pooling services.
DbUtilsJDBC helper library.
DigesterXML-to-Java-object mapping utility.
DiscoveryTools for locating resources by mapping service/reference names to resource names.
ELInterpreter f+r die Expression Language (Definiert in der JSP 2.0 Spezifikation).
EmailLibrary zum Versand von e-mail mit Java.
ExecAPI für externe Prozessaufrufe und Environment (Umgebungsvariablen) Management in Java.
FileUploadFile upload capability for your servlets and web applications.
IOSammlung I/O Utilities.
JCIJava Compiler Interface
JellyXML based scripting und processing engine.
JexlExpression language which extends the Expression Language of the JSTL.
JXPathUtilities for manipulating Java Beans using the XPath syntax.
LangProvides extra functionality for classes in java.lang.
LauncherCross platform Java application launcher.
LoggingWrapper around a variety of logging API implementations.
MathLightweight, self-contained mathematics and statistics components.
ModelerMechanisms to create Model MBeans compatible with JMX specification.
NetSammlung von Network Ultilities und Protokoll-Implementierungen.
PoolGeneric object pooling component.
PrimitivesSmaller, faster and easier to work with types supporting Java primitive types.
ProxyLibrary for creating dynamic proxies.
SanselanA pure-Java image library.
SCXMLAn implementation of the State Chart XML specification aimed at creating and maintaining a Java SCXML engine. It is capable of executing a state machine defined using a SCXML document, and abstracts out the environment interfaces.
TransactionImplementations for multi level locks, transactional collections and transactional file access.
ValidatorFramework to define validators and validation rules in an xml file.
VFSVirtual File System component for treating files, FTP, SMB, ZIP and such like as a single logical file system.

Leave a Reply

Required fields are marked *.