0

ファイル転送にWebSocketを使用していますが、ファイルをダウンロードしているときにデータをそのまま受信していますが、画像ファイルを開くと破損していました。データファイルは正常にダウンロードされています。コードは次のようになります。

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

それがオプションではなく、サーバーからテキストフレームのみを送信できる場合は、サーバーから送信する前にバイナリデータをテキストにエンコードしてから、もう一方の端でテキストをデコードする必要があります。バイナリデータをWebSocketを介してテキストフレームとして直接送信しようとすると、charCodeAt(x) && 0xffデータが破損します。

たとえば、サーバーでデータをbase64エンコードしてから、クライアントでデータをbase64デコードできます。

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

更新

websockifyには、非常に優れたパフォーマンスの純粋なJavascriptbase64デコード/エンコードが含まれています。0〜255の数値の配列にデコードされますが、必要に応じて文字列を返すように簡単に変更できます(免責事項:websockifyを作成しました)。

于 2012-07-24T12:54:03.153 に答える