2012-03-03 676 views
18

我正在與Mozilla Europe合作。在這個項目中,我使用Worlize(服務器端)和Mozilla(客戶端)的websocket,Node.js嘗試將文件從客戶端上傳到服務器。
我目前的目標是將文件的arraybuffer發送到服務器。創建數組緩衝區併發送它很好。
但我的服務器告訴我,arraybuffer是一個utf8消息,而不是一個二進制消息。如何通過Websocket將arraybuffer作爲二進制發送?

我誤解了什麼嗎?如果沒有,我該如何糾正?

客戶端:

reader = new FileReader(); 
    reader.readAsArrayBuffer(file); 
    reader.onload = function(e) { 
     connection.send(e.target.result); 
    }; 

服務器端:

ws.on('message', function(message,flags) { 
if (!flags.binary) { 
    //some code 
} 
else { 
    console.log('It\'s a binary'); 
} 

我嘗試用Blob過,同樣的結果。二進制部分是不可見的。

+1

這是一個問答網站, 「叉和參與」 不會發生在這裏(請參見http: //stackoverflow.com/faq)。另外,請不要讓人們挖掘你的代碼 - 包括解釋你到底在做什麼的最低代碼。 – 2012-03-03 20:46:11

+0

我意識到這是前一段時間提出的,所以我只是想補充一點,Firefox 11及以後版本支持二進制ArrayBuffer和Blob。 – SpliFF 2012-07-05 01:35:03

回答

19

Gecko11.0 ArrayBuffer發送和二進制數據已經實施的支持。

connection = new WebSocket('ws://localhost:1740'); 
connection.binaryType = "arraybuffer"; 
connection.onopen = onopen; 
connection.onmessage = onmessage; 
connection.onclose = onclose; 
connection.onerror = onerror; 

發送二進制數據:

function sendphoto() { 
    imagedata = context.getImageData(0, 0, imagewidth,imageheight); 

    var canvaspixelarray = imagedata.data; 


    var canvaspixellen = canvaspixelarray.length; 
    var bytearray = new Uint8Array(canvaspixellen); 

    for (var i=0;i<canvaspixellen;++i) { 
     bytearray[i] = canvaspixelarray[i]; 
    } 

    connection.send(bytearray.buffer); 
    context.fillStyle = '#ffffff'; 
    context.fillRect(0, 0, imagewidth,imageheight);  
} 

Recieving二進制數據:

if(event.data instanceof ArrayBuffer) 
    { 

     var bytearray = new Uint8Array(event.data); 


     var tempcanvas = document.createElement('canvas'); 
      tempcanvas.height = imageheight; 
      tempcanvas.width = imagewidth; 
     var tempcontext = tempcanvas.getContext('2d'); 

     var imgdata = tempcontext.getImageData(0,0,imagewidth,imageheight); 

     var imgdatalen = imgdata.data.length; 

     for(var i=8;i<imgdatalen;i++) 
     { 
      imgdata.data[i] = bytearray[i]; 
     } 

     tempcontext.putImageData(imgdata,0,0); 


     var img = document.createElement('img'); 
      img.height = imageheight; 
      img.width = imagewidth; 
      img.src = tempcanvas.toDataURL(); 
     chatdiv.appendChild(img); 
     chatdiv.innerHTML = chatdiv.innerHTML + "<br />"; 
    } 
相關問題