Javascript XHR发送multipart/form-data

php*_*_qq 5 javascript multipartform-data xmlhttprequest

我正在尝试发送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--');
Run Code Online (Sandbox Code Playgroud)

然后在php我只打印$_POST数组

print_r($_POST);
Run Code Online (Sandbox Code Playgroud)

但我每次都得到一个空数组.我希望看到

Array (
    name => "test"
)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Rob*_*b W 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--');
Run Code Online (Sandbox Code Playgroud)

注意:您的代码仅适用于由UTF-8字符组成的有效负载,而不是二进制数据.如果您想了解有关通过XMLHttpRequest提交包含二进制数据的表单的更多信息,请参阅此答案及其链接引用.

  • 提及边界分隔符总是以两个(附加)破折号为前缀并在身体末端加上两个后缀,这可能会有所帮助.也就是说如果你在标题中有`... boundary = bound750`那么你需要`--bound750 \n`和`--bound750 - 作为最后一行. (2认同)