我正在研究“多个ajax uloader”。适用于前沿浏览器(Chrome 6,Firefox 4)。但是在Firefox 3.6中我必须手动创建要发送的输出字符串,因为这个浏览器不支持FormData对象。
我遵循了许多教程,特别是this。作者通知正确设置标题&要发送的身体内容。我仔细地遵循了这些建议,但Firefox 3.6失败了。
这是标题和正文的正确设置(通过提交简单的静态表单捕获): correct headers,correct body
这是我得到的,当我使用Firefox的xhr对象提交相同的数据时: wrong headers,wrong 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 file,dump body
有任何人知道,为什么xhr会以这种方式破坏标题?
答案 0 :(得分:0)
我正在寻找问题。我尝试在WinXP下使用新的Firefox安装代码(我的主系统是Arch Linux)。问题仍然存在我发现Mozilla's xhr有一个名为'multipart'的附加属性。将此设置为true,标题即可,但我的xhr.events未被触发 - 发送文件后JS崩溃。
我使用Firebug的JS调试器进行了更深入的研究,发现在xhr.multipart = true;
代码跳入jQuery库的深处之后,在一些奇怪的事件周围发生了奇怪的事情。
更糟糕的是,标题/内容似乎在Firebug的控制台中是正确的,但在HttpFox扩展中,它已被破坏。