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