在BlobBuilder中更改文件名以在XHR上作为FormData传递

Chi*_*tor 3 javascript multipartform-data xmlhttprequest mime-types

我正在尝试将ArrayBuffer上传到服务器(我无法更改),期望我以多部分/表格数据格式上传文件.服务器从Content-Disposition部件中提取filename将保存的部分,并在Content-type提供文件时将使用的MIME类型下.目前,我成功上传文件:

var xhr = new XMLHttpRequest();
var fdata = new FormData();
var bb;

if (WebKitBlobBuilder) {
    bb = new WebKitBlobBuilder();
} else if (MozBlobBuilder) {
    bb = new MozBlobBuilder();
} else if (BlobBuilder) {
    bb = new BlobBuilder();
}

bb.append(obj.array);

fdata.append('file', bb.getBlob("application/octet-stream"));

xhr.open("POST", url, true);
xhr.send(fdata);
Run Code Online (Sandbox Code Playgroud)

但是标题会像浏览器一样在Chrome上发送,例如:

Content-Disposition: form-data; name="file"; filename="blob"
Content-Type: application/octet-stream;
Run Code Online (Sandbox Code Playgroud)

我打算用FileWriter API将它保存到一个临时文件,然后上传它,但这是不对的.

在回答时,请考虑:

  • 服务器无法修改,也不愿意选择其他服务器提供商.
  • 它必须至少在Firefox和Chrome上运行(我的应用仅限于这两种浏览器).

Chi*_*tor 5

我自己解决了这个问题,感谢Chromium问题指出了我对w3c标准草案XMLHttpRequest的回答.基本上我应该改变:

fdata.append('file', bb.getBlob("application/octet-stream"));
Run Code Online (Sandbox Code Playgroud)

至:

fdata.append('file', bb.getBlob("application/octet-stream"), obj.filename);
Run Code Online (Sandbox Code Playgroud)

并且它给出了期望的结果.