Chrome WebKitBlobBuilder不会附加数据

Seb*_*ien 5 javascript ajax binary webkit xmlhttprequest

我正在通过ajax请求实现一些文件上传功能.我希望能够在一个ajax调用中发送多个文件,所以我决定使用FormData.

我试图将我的二进制数据字符串直接附加到FormData(并且它可以工作),但Content-Disposition没有文件名属性:Content-Disposition:form-data; NAME = "文件1"

w3c说我需要将一个blob对象附加到formdata以具有该属性(或者能够使用FormData.append()的3rd属性设置它)

我写了以下代码:

function uploadAsBinary() {
    var xhr = new XMLHttpRequest();
    var fd = new FormData();

    window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;
    var bb = new window.BlobBuilder();
    bb.append("this is my binary content");
    var blob = bb.getBlob("text/plain"); 

    fd.append("file1", blob, "file1");

    xhr.open("POST", "/mb/0/", false);
    xhr.send(fd);
}
Run Code Online (Sandbox Code Playgroud)

它与firefox完全兼容,但是使用谷歌浏览器(v16和v17),请求有效负载是一个没有内容的formdata:

------WebKitFormBoundaryVkgESMAGtmPMlPZ7
Content-Disposition: form-data; name="file1"; filename="file1"
Content-Type: text/plain


------WebKitFormBoundaryVkgESMAGtmPMlPZ7--
Run Code Online (Sandbox Code Playgroud)

我也尝试通过ArrayBuffer填充blob,结果相同.我已经在网上冲浪了2天,我找不到答案.我在Android上发现了一个未解决的问题(http://code.google.com/p/android/issues/detail?id=22441),但它似乎已经死了.

这是一个真正的铬问题吗?有人对此有所了解,还是应该在铬跟踪器上打开一个问题?

谢谢你的帮助!

cor*_*ulu 1

对于在这里寻找解决方案的人来说,问题是切换到 Blob() 而不是 BlobBuilder(),如此处所述

斑点生成器():

window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder ||
                 window.MozBlobBuilder || window.MSBlobBuilder;
window.URL = window.URL || window.webkitURL;

var bb = new BlobBuilder();
bb.append('body { color: red; }');
var blob = bb.getBlob('text/css');

var link = document.createElement('link');
link.rel = 'stylesheet';
link.href = window.URL.createObjectURL(blob);

document.body.appendChild(link);
Run Code Online (Sandbox Code Playgroud)

斑点():

window.URL = window.URL || window.webkitURL;

var blob = new Blob(['body { color: red; }'], {type: 'text/css'});

var link = document.createElement('link');
link.rel = 'stylesheet';
link.href = window.URL.createObjectURL(blob);
document.body.appendChild(link);
Run Code Online (Sandbox Code Playgroud)