2012-03-03 20 views
18

Estoy trabajando en un proyecto con Mozilla Europe. En este proyecto, uso websocket de Worlize (lado del servidor) y Mozilla (lado del cliente), Node.js para intentar cargar archivos de un cliente a un servidor.
Mi objetivo actual es enviar un arraybuffer del archivo al servidor. Crea el arraybuffer y envíalo está bien.
Pero mi servidor me dice que arraybuffer es un mensaje utf8 y no un mensaje binario.¿Cómo enviar arraybuffer como binario a través de Websocket?

¿Entiendo mal algo? Si no, ¿cómo puedo corregir eso?

lado del cliente:

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

lado del servidor:

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

trato con Blob también, mismo resultado. La parte binaria es invisible.

+1

Se trata de un Q & R, "tenedor y participar" no va a ocurrir aquí (ver http: //stackoverflow.com/faq). Además, no solicite a las personas que examinen su código: incluya el código mínimo necesario para explicar qué está haciendo exactamente. –

+0

Me doy cuenta de que esto fue preguntado hace un tiempo, por lo que he dicho que solo quiero agregar que Firefox 11 y versiones posteriores admiten ArrayBuffer y Blob binarios. – SpliFF

Respuesta

19

Gecko11.0 ArrayBuffer enviar y recibir soporte para datos binarios se ha implementado.

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

el envío de datos binarios:

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

recibiendo datos binarios:

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 />"; 
    } 
Cuestiones relacionadas