2012-09-10 5 views
6

Ich lade eine Datei mit XMLHttprequest hoch. Hier ist die JS-Funktion, lädt dass eine Datei:Hochladen einer Datei mit XMLHttprequest - Fehlende Grenze in multipart/form-data

var upload = function(file) { 
    // Create form data 
    var formData = new FormData(); 
    formData.append('file', file); 

    var xhr = new XMLHttpRequest(); 

    // Open 
    xhr.open('POST', this.options.action); 

    // Set headers 
    xhr.setRequestHeader("Cache-Control", "no-cache"); 
    xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 
    xhr.setRequestHeader("Content-Type", "multipart/form-data"); 
    xhr.setRequestHeader("X-File-Name", file.fileName); 
    xhr.setRequestHeader("X-File-Size", file.fileSize); 
    xhr.setRequestHeader("X-File-Type", file.type); 

    // Send 
    xhr.send(formData); 
} 

Auf der Serverseite, in upload.php ich die Datei auf diese Weise lesen:

file_put_contents($filename, (file_get_contents('php://input'))); 

Alles funktioniert gut, außer dass Ich bekomme eine PHP-Warnung:

Missing boundary in multipart/form-data POST data in Unknown on line 0. Wenn ich diese Zeile entferne: xhr.setRequestHeader("Content-Type", "multipart/form-data"); verschwindet die Warnung.

Was sollte das Problem hier sein?

+1

Verwenden Sie als Inhaltstyp 'application/x-www-form-urlencoded'. Oder lassen Sie es aus, da dies der Standardinhaltstyp ist, der von einer Ajax-Anfrage gesendet wird. –

+1

Dies kann funktionieren, aber für große Dateien (sogar 5-600 KB) wird der Browser einfrieren, weil er die Datei in einem "Text" -Format senden muss. Ich muss die 'multipart/form data' verwenden. –

+2

Sorry, habe das Datei-Upload-Bit übersehen (weiß nicht wie), aber [ich denke, das könnte deine Frage beantworten] (http://stackoverflow.com/questions/5933949/how-to-send-multipart-form- data-form-content-by-ajax-no-jquery), genauer gesagt: 'xhr.setRequestHeader (" Inhaltstyp "," multipart/form-data; Zeichensatz = utf-8; boundary = "+ Math.random () .toString(). substr (2)); 'sollte den Trick machen –

Antwort

8

Nun ist dieses seltsame ein wenig für mich, aber das ist, was funktioniert hat:

// Open 
xhr.open('POST', this.options.action, true); 

// !!! REMOVED ALL HEADERS 

// Send 
xhr.send(formData); 

In diesem Fall auf Server-Seite ich über php://input gesandt die Datei nicht lesen, aber die Datei wird in das $_FILES Array.

Das löste mein Problem, aber ich bin immer noch neugierig, warum erscheint jetzt die Datei in $_FILES?

Getestet in Chrome, Mozilla, Safari und IE10.

+8

[Die Spezifikation] (http://www.w3.org/TR/XMLHttpRequest/#the-send-method) erklärt (Punkt 3), dass der Browser die richtigen Header (einschließlich der korrekten Multipart-Boundary-Indication im Content- Geben Sie) ein, wenn Sie nichts manuell angegeben haben. Die Datei erscheint in '$ _FILES', da PHP [automatisch Dateien aus mehrteiligen Formular-Uploads in diesem Superglobal ablegt] (http://www.php.net/manual/en/features.file-upload.post-method.php). – Gijs

+0

Danke, dass Sie mir geholfen haben, dies zu verstehen. –

+0

entfernt die 'multipart/form-data' alleine hat funktioniert. – ulab