2013-12-22 7 views
5

Ich versuche, eine multipart/form-data content-type Anfrage zu senden:Javascript XHR senden multipart/form-data

var xhr = new XMLHttpRequest(); 

xhr.onreadystatechange = function(){ 
    if(xhr.readyState==4){ 
     alert(xhr.responseText); 
    } 
} 

xhr.open("POST", url, true); 
xhr.setRequestHeader("Content-Type","multipart/form-data; boundary=---------------------------275932272513031"); 

xhr.send('-----------------------------275932272513031 Content-Disposition: form-data; name="name" 

test 

----------------------------275932272513031--'); 

dann in php Ich drucke nur die $_POST Array

print_r($_POST); 

Aber ich bekomme jedes Mal ein leeres Array. Ich erwarte zu sehen

Array (
    name => "test" 
) 

Was mache ich falsch?

+0

Warum können Sie jQuery nicht verwenden? –

+1

@ Glavić Ich mache das mit einem pädagogischen Zweck –

+0

Bitte Postleitzahl, die Ihren realen Code widerspiegelt. Ihr aktueller Code wird nicht einmal ausgeführt. Wo sind Ihre Zeilenbegrenzer? –

Antwort

7

Ihr Code ist fehlgeschlagen, weil Sie "Enter" anstelle eines Zeilenumbruchzeichens (\n) verwendet haben.
JavaScript unterstützt "first line[Enter]second line" nicht. Wenn Sie eine Zeichenfolge mit einem Zeilenumbruch benötigen, verwenden Sie "first line\nsecond line".

Nachdem Sie dieses Problem behoben haben, Ihr Code sollte wie vorgesehen (mit einer Einschränkung, letzte Anmerkung e):

var xhr = new XMLHttpRequest(); 
xhr.onload = function() { 
    alert(xhr.responseText); 
}; 
xhr.open("POST", url, true); 
xhr.setRequestHeader("Content-Type","multipart/form-data; boundary=---------------------------275932272513031"); 
xhr.send('-----------------------------275932272513031\n' + 
     'Content-Disposition: form-data; name="name"\n\n' + 
     'test\n\n' + 
     '----------------------------275932272513031--'); 

HINWEIS: Ihr Code wird nur für Nutzlasten arbeiten, besteht von UTF-8 Zeichen, nicht binäre Daten. Weitere Informationen zum Senden von Formularen mit Binärdaten über XMLHttpRequest finden Sie unter this answer und den verknüpften Verweisen.

+0

Super, vielen Dank für die Referenz, erklärt wirklich viel jetzt! –

+2

Es ist vielleicht hilfreich zu erwähnen, dass dem Grenztrenner immer zwei (zusätzliche) Bindestriche vorangestellt sind und am Ende des Körpers zwei weitere hinzugefügt werden. Das heißt, wenn Sie "... boundary = bound750" in der Kopfzeile haben, dann brauchen Sie als letzte Zeile "--bound750 \ n" und "--bound750 -". – TNT

+1

... und dass Bindestriche in der Grenze überhaupt nicht benötigt werden. Es könnte sinnvoll sein, den Post in 'boundary = 275932272513031' zu ändern und dann die beiden Bindestriche in jede Zeile' --275932272513031' (um die Anforderung zu verdeutlichen) – Shanimal