图像文件因websocket文件传输而损坏

时间:2012-07-24 05:01:48

标签: javascript html5 websocket blob html5-filesystem

我正在使用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);
}

1 个答案:

答案 0 :(得分: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)。