Ajax File Upload mit HTML5 und XHR2 (ohne Plugin oder Iframe-Hack)

Ajax File Upload mit HTML5

In wenigen Zeilen zum File-Ajax-Call

Bilder oder andere Dateien via Ajax zu übermitteln war mit XMLHttpRequest Level 1 bis dato eine äußert unschöne Angelegenheit – denn nur einfache Daten konnten gesendet werden. Um den Ajax-File-Upload trotzdem zu realisieren, verwendeten Webworker deshalb Iframe-Hacks in verschiedensten JavaScript-Plugins. XHR 2 bietet nun allerdings die Möglichkeit die Scripts der bisherigen Webseiten aufzuräumen und ganz nativ Dateien via Ajax an den Server zu senden.

FormData() macht es möglich

XHR 2 bietet mit dem FormData()-Interface nun die Möglichkeit Bilder oder andere Dokumente für den darauffolgenden Ajax-Call aufzubereiten. Nach dem Initialisieren in einer Variable, kann via append()-Methode jeder einzelne Parameter hinzugefügt werden. Ein einfaches Beispiel mit jQuery:


$(‘body’).on('change', '#fileUploader', function() {

    // Post-Daten vorbereiten
    var data = new FormData();
    data.append('file', this.files[0]);
    data.append('foo', 1);

    // Ajax-Call
    $.ajax({
        url: ‘/fileupload.php’,
        data: data,
        type: ‘POST’
        processData: false,
        contentType: false,
        success: function(evt) { // Bild anzeigen }
    });


});

Das File-Input mit der ID #fileUploader triggert bei jeder Änderung (und somit jedem Upload) die change-Funktion. Via FormData() und .append(key, value) werden die einzelnen Parameter für den Call vorbereitet. Mit this.file[0] gelangt man zur ersten hochgeladenen Datei dieses Inputs. Multi-File-Uploads via Ajax können somit ebenfalls problemlos durchgeführt werden.

Der $.ajax()-Methode von jQuery müssen folgende Konfigurationen hinterlegt werden: processData und contentType auf false.

Im PHP-Dokument fileupload.php kann nun ganz normal mit $_FILE[] auf die Dateien bzw. $_POST[] auf die anderen Parameter zugegriffen werden.

Browser-Support

Gute Nachricht: Moderne Browser (Firefox, Chrome, Opera, Safari) unterstüzen XHR2 und somit FormData() komplett. Der Internet Explorer leider erst ab Version 10. Wer an Backends oder anderen modernen Webseiten bastelt, die also nicht Browserübergreifend gleich funktionieren müssen, eine denkbare Lösung. Alternativ kann natürlich auch ein Fallback zu einem Java-Script Plugin mit Iframe Hack eingerichtet werden.