2012-07-24 74 views
0

我正在使用websockets進行文件傳輸,而我正在下載文件我接收數據,因爲它,但是當我打開一個圖像文件已損壞。數據文件正常下載,代碼如下。圖像文件損壞與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); 
} 

回答

1

看起來你是從的WebSocket作爲字符串中讀取數據,將其轉換爲一個斑點,然後寫這一個文件。

如果您擁有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); 
} 

更新

有一個很好的執行純JavaScript的base64解碼/編碼包含在websockify中。它解碼爲0-255的一組數字,但可以很容易地修改爲返回一個字符串,而如果這是你所需要的(免責聲明:我做了websockify)。

+0

對不起!在這裏,我有一個問題,我在工作人員這樣做,所以沒有btoa atob功能允許。無論如何感謝您的回覆 – kirankumar 2012-07-30 12:42:52

+0

根據W3C(http://www.w3.org/TR/workers/#apis-available-to-workers)和Mozilla(https://developer.mozilla.org/en/ DOM/Worker/Functions_available_to_workers),Web Workers應該可以使用base64功能(以及定時功能)。 – kanaka 2012-07-30 13:36:32

+0

但我建立我的應用程序只用於鉻。 – kirankumar 2012-07-31 10:28:42