2013-12-22 40 views
5

我試圖發送一個多部分/格式數據的內容類型請求:的Javascript XHR發送的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--'); 

然後在PHP我只打印$_POST陣列

print_r($_POST); 

但我每次都得到一個空數組。我期待看到

Array (
    name => "test" 
) 

我在做什麼錯?

+0

爲什麼你不能使用jQuery? –

+1

@Glavić我這樣做的教育目的 –

+0

請張貼反映您的真實代碼的代碼。你當前的代碼甚至不運行。你的逃跑線終結者在哪裏? –

回答

7

由於您使用「Enter」而不是轉義換行符(\n),您的代碼失敗。
JavaScript不支持"first line[Enter]second line"。如果您需要帶換行符的字符串,請使用"first line\nsecond line"

在修正這個問題,你的代碼應該工作打算(有一點需要注意,見最後注):

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--'); 

注意:您的代碼將只用於由有效載荷工作UTF-8字符,不是二進制數據。如果您想了解更多關於通過XMLHttpRequest提交二進制數據的表單,請參閱this answer及其鏈接的引用。

+0

真棒,感謝您的參考,現在真的解釋了很多! –

+2

或許有必要提一下,邊界分隔符總是以兩個(附加的)破折號作爲前綴,並在主體的末尾添加兩個後綴。這就是說,如果你在頭部有'... boundary = bound750',那麼你需要'--bound750 \ n'和'--bound750 - '作爲最後一行。 – TNT

+1

...並且在所有邊界中不需要破折號。將帖子更改爲「邊界= 275932272513031」,然後將兩個連字符更改爲每行「-275932272513031」(以闡明要求)可能是有意義的, – Shanimal