Chrome WebKitBlobBuilder没有't附加数据

Chrome WebKitBlobBuilder doesn't append data

本文关键字:数据 WebKitBlobBuilder 没有 Chrome      更新时间:2023-09-26

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

我试图将二进制数据字符串直接附加到FormData(它很有效),但Content-Disposition没有filename属性:内容处置:表单数据;name="file1"

w3c说,我需要将一个blob对象附加到formdata以具有该属性(或者可以使用formdata.append()的第三个属性设置它)

我写了以下代码:

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);
}

它在firefox上运行得很好,但在googlechrome(v16和v17)上,请求负载是一个没有内容的表单数据:

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

------WebKitFormBoundaryVkgESMAGtmPMlPZ7--

我还尝试通过ArrayBuffer填充blob,结果也是一样。我已经上网两天了,没有找到答案。我在android上发现了一个悬而未决的问题(http://code.google.com/p/android/issues/detail?id=22441)但它似乎已经死了。

这是一个真正的铬问题吗?有人对此有线索吗?还是我应该打开铬跟踪器的问题?

谢谢你的帮助!

对于任何在这里寻找解决方案的人来说,问题是切换到Blob(),而不是这里解释的BlobBuilder()

Blob生成器():

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);

Blob():

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);

tl;drChrome开发工具将从数据负载预览中剪辑文件数据。从BlobBuilder切换到Blob解决了这个问题,但有效载荷的预览仍然不会显示文件数据;它看起来和你发布的一样(显然是空的)。

你描述的症状是骗人的。我遇到了一个类似的问题(原来是由于Content-Type的错误过载引起的,但我跑题了)。

当我的问题得到解决时,我注意到Chrome开发工具显示的是纯键/值数据,而不是文件数据。当上传一个大文件时,我会得到这样的东西:

------WebKitFormBoundaryHyzYwSEV4FAfvi02
Content-Disposition: form-data; name="uploadType"
media
------WebKitFormBoundaryHyzYwSEV4FAfvi02
Content-Disposition: form-data; name="fileupload"; filename="blob"
Content-Type: application/zip

------WebKitFormBoundaryHyzYwSEV4FAfvi02--

请注意,"普通"数据uploadType=media会显示,而文件数据不会显示。我确认文件上传正确的唯一方法(而不是最终从服务器获得成功代码)是在请求完成后查看Chrome开发工具的"网络"选项卡中的请求标头。它显示了content-length: 1023235,比假定的空文件有效载荷显示的要大得多。