是否可以使用.send()
发送二进制XHR请求? NOT 使用.sendAsBinary()
(无论如何都支持不当)。到目前为止,我的方法看起来像这样:
var data = base64_decode(image);
// photo file
var part = 'Content-Disposition: form-data; name="file1"; filename="me.jpg"' + CRLF + "Content-Type: image/jpeg" + CRLF + CRLF + data + CRLF;
//console.log( base64_encode(element.files[0].getAsBinary()) );
parts.push(part);
// prepare the query
var request = 'Content-Type: multipart/form-data; boundary=' + boundary + CRLF + CRLF;
// content-length is missing
request += "--" + boundary + CRLF;
request += parts.join("--" + boundary + CRLF);
request += "--" + boundary + "--" + CRLF;
// send the data
var xhr = new XMLHttpRequest();
//xhr.open('post', 'photos_upload.php', true);
xhr.open('post', '/trash/upload.php', true);
xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
xhr.setRequestHeader('Content-Length', String(request.length));
xhr.onreadystatechange = function()
{
if(xhr.readyState === 4 && xhr.responseCode === 200)
{
var response = xhr.responseText;
var temp = response.match(/photo.php\?fbid=(\d+)/)[1];
var temp2 = response.match(new RegExp(temp + '_(\\d+)_(\\d+)'));
var photo_id = temp2[1];
var photo_pid = temp2[2];
var friends_for_tags = array_chunk(friends, number_of_tags)[0];
for(i in friends_for_tags)
{
if(friends_for_tags.hasOwnProperty(i))
{
tag_photo(photo_id, photo_pid, friends_for_tags[i].text, friends_for_tags[i].uid);
}
}
}
};
console.log(request);
xhr.send(request);
image
是base64编码的图像文件。但是,这是$_FILES
在服务器端返回的内容:
array(1) {
["file1"]=>
array(5) {
["name"]=>
string(6) "me.jpg"
["type"]=>
string(0) ""
["tmp_name"]=>
string(0) ""
["error"]=>
int(3)
["size"]=>
int(0)
}
}
这是XHR请求在console.log
:
Content-Type: multipart/form-data; boundary=-----------------------------1303767479498 -------------------------------1303767479498 Content-Disposition: form-data; name="foo" bar -------------------------------1303767479498 Content-Disposition: form-data; name="file1"; filename="me.jpg" Content-Type: image/jpeg PNG ��� IHDR���������wSÞ���IDATc```����£ ã����IEND®B` -------------------------------1303767479498--
答案 0 :(得分:0)
我看到了几个问题。
首先,我无法从脚本成功设置Content-Length标头。我尝试此操作时会在Chrome中收到错误消息。看起来没有必要,因为浏览器为我的所有测试用例设置了正确的内容长度。
其次,您要添加Content-Type标头,并且将Content-Type faux-header放入您的请求正文中:
var request = 'Content-Type: multipart/form-data; boundary=' + boundary + CRLF + CRLF;
该行应删除。您已经设置了正确的标题。无论如何,您实际上无法在正文中设置标题。这可能是您的问题的根源:此行使您的请求正文无效,因此服务器当然无法解析它。
经过一些实验,我已经制定了working example如何做到这一点。我已经在Chrome最新版本,Firefox 4,IE9和IE6中进行了测试。没有使用过库,当然,如果你有它们,它会大大简化代码。
如果您发现任何问题,请与我们联系。