5

我正在写一些东西,它需要一个画布(具有 1 位像素颜色深度),将其转换为 Uint8Array(一个字节代表 8 个像素),然后在接收其他类似编码的消息时将其发送出去。

我认为 blob 非常适合这种数据,我创建了一个 blob,创建 FormData,将 blob 附加到 FormData,然后像这样发送它:

function sendFormData(data){
    //data.data is a Uint8Array other attributes are strings
    var bytesBlob = new Blob([data.data],{type: "application/octet-stream"});
    console.log(bytesBlob,data.data);
    var form = new FormData();
    var request = new XMLHttpRequest();
    form.append("blob",bytesBlob,"message");
    form.append("user",data.user);
    form.append("colour",data.colour);
    form.append("room",currentRoom);
    request.open("POST","http://localhost:8080/",true);
    request.send(form);
}

现在,在创建 blob 后使用 console.log,我可以看到 blob 的长度,它应该是 2035,并且在 Chrome 中,但在其他 webkit 浏览器(Safari)上,大小是 19。

这是因为,它不是从 Uint8Array 中创建一个 blob,而是从“[object Uint8Array]”这个词中创建一个 blob,这显然对任何人都没有用。

当我从服务器下载其中一个 blob 时,我看到了这一点:

$ cat blob-1 [object Uint8Array]

我猜这是 Uint8Array 对象在某个时候得到 toString() 的结果,那么我如何确保它作为实际的二进制数据发送?

我想知道我是否正确地处理了这个问题,使用 blob 或发送数据的最佳方法是什么?特别是因为目标平台似乎引发了异常并停止而不是使“[object Uint8Array]”

目标平台只是 Webkit,所以我不必担心其他类型的浏览器。谢谢。

4

0 回答 0