实际上是否可以使用.send()发送二进制XHR请求?

时间:2011-04-25 21:34:05

标签: php javascript xmlhttprequest

是否可以使用.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-- 

1 个答案:

答案 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中进行了测试。没有使用过库,当然,如果你有它们,它会大大简化代码。

如果您发现任何问题,请与我们联系。