0

我正在使用 websockets 进行文件传输,在下载文件时,我正在接收数据,但是当我打开图像文件时,它已损坏。数据文件下载正常,代码如下。

try {
    fileEntry = fs.root.getFile(filename, { create : creat_file });
    var byteArray = new Uint8Array(data.data.length);
    for (var i = 0; i < data.data.length; i++) {
        byteArray[i] = data.data.charCodeAt(i) & 0xff;
    }
    BlobBuilderObj = new WebKitBlobBuilder();
    BlobBuilderObj.append(byteArray.buffer);
    if (!writer) {
        writer = fileEntry.createWriter();
        pos = 0;
    }
    //self.postMessage(writer.position);
    writer.seek(pos);
    writer.write(BlobBuilderObj.getBlob());
    pos += 4096;
    }
catch (e) {
    errorHandler(e);
}
4

1 回答 1

1

看起来您正在从 WebSocket 作为字符串读取数据,将其转换为 Blob,然后将其写入文件。

如果您可以控制 WebSocket 服务器,那么最好的办法是将数据作为二进制帧而不是 UTF-8 文本数据发送。如果您可以让服务器以二进制帧的形式发送数据,那么您只需告诉 WebSocket 将数据作为 Blob 传递:

ws.binaryType = "blob";
ws.onmessage = function (event) {
    if (event.data instanceof Blob) {
        // event.data is a Blob
    } else {
        // event.data is a string
    }
}

如果这不是一个选项并且您只能从服务器发送文本帧,那么您需要在从服务器发送二进制数据之前将其编码为文本,然后在另一端解码文本。如果您尝试通过 WebSockets 直接将二进制数据作为文本帧发送,那么这样做charCodeAt(x) && 0xff会导致数据损坏。

例如,您可以在服务器端对数据进行 base64 编码,然后在客户端对数据进行 base64 解码:

ws.onmessage = function (event) {
    raw = window.atob(event.data);
}

更新

websockify中包含一个性能非常好的纯 Javascript base64 解码/编码。它解码为一个 0-255 的数字数组,但如果这是您需要的,可以很容易地修改为返回一个字符串(免责声明:我制作了 websockify)。

于 2012-07-24T12:54:03.153 回答