XmlHttpRequest使用“Content-Type:multipart / form-data”破坏Firefox 3.6中的标头

时间:2010-07-15 19:53:03

标签: ajax upload file-upload xmlhttprequest header

我正在研究“多个ajax uloader”。适用于前沿浏览器(Chrome 6,Firefox 4)。但是在Firefox 3.6中我必须手动创建要发送的输出字符串,因为这个浏览器不支持FormData对象。

我遵循了许多教程,特别是this。作者通知正确设置标题&要发送的身体内容。我仔细地遵循了这些建议,但Firefox 3.6失败了。

这是标题和正文的正确设置(通过提交简单的静态表单捕获): correct headerscorrect body

这是我得到的,当我使用Firefox的xhr对象提交相同的数据时: wrong headerswrong body

正如您所见,xhr的标头已损坏。这导致文件上传完全失败。这是我使用的代码:

function generateBoundary()
{
    var chars = '0123456789',
        out   = '';

    for( var i = 0, len = chars.length; i < 30; i++) {
       out += chars[Math.floor(Math.random()*len)];
    }

    return '----' + out;
}

function getMultipartFd(file, boundary)
{
    var rn   = '\r\n',
        body = '';

    body  = boundary + rn;
    body += 'Content-Disposition: form-data; name="Files[]"; filename="' + file.name + '"' + rn;
    body += 'Content-Type: ' + file.type + rn + rn;
    body += file.getAsBinary() + rn;

    return body;
}

$(function(){

    $startUpload.click(function(){
        var url      = $uploadForm.attr('action'),
            xhr      = new XMLHttpRequest(),
            boundary = generateBoundary(),
            file     = null,
            body     = '';

        file = $SOME_ELEMENT_WITH_ATTACHED_FILE.file;
        body = getMultipartFd(file, boundary);

console.info(file);
console.info(body);

        xhr.upload.onload = function(){
            console.info('done');
        };

        xhr.open('POST', url, true);
        xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
        xhr.sendAsBinary(body + boundary + '--' + '\r\n');
        return false;
    });

});

这里还有一个文件和体变量的转储: dump filedump body

有任何人知道,为什么xhr会以这种方式破坏标题?

1 个答案:

答案 0 :(得分:0)

我正在寻找问题。我尝试在WinXP下使用新的Firefox安装代码(我的主系统是Arch Linux)。问题仍然存在我发现Mozilla's xhr有一个名为'multipart'的附加属性。将此设置为true,标题即可,但我的xhr.events未被触发 - 发送文件后JS崩溃。

我使用Firebug的JS调试器进行了更深入的研究,发现在xhr.multipart = true;代码跳入jQuery库的深处之后,在一些奇怪的事件周围发生了奇怪的事情。

更糟糕的是,标题/内容似乎在Firebug的控制台中是正确的,但在HttpFox扩展中,它已被破坏。