2012-03-03 52 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 />"; 
    } 
相关问题