2012-03-03 17 views
18

Pracuję nad projektem z Mozillą Europe. W tym projekcie używam websocket przez Worlize (po stronie serwera) i Mozilla (strona klienta), Node.js, aby spróbować przesłać pliki z klienta na serwer.
Mój obecny cel to wysłanie pliku arraybuffer na serwer. Utwórz arraybuffer i wyślij go w porządku.
Ale mój serwer mówi mi, że arraybuffer jest wiadomością utf8, a nie binarną.Jak wysłać arraybuffer jako plik binarny przez Websocket?

Czy źle zrozumiałem coś? Jeśli nie, jak mogę to poprawić?

po stronie klienta:

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

po stronie serwera:

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

próbuję z Blob też samego rezultatu. Część binarna jest niewidoczna.

+1

To Q & A strona "widelec i uczestniczyć" nie wydarzy się tutaj (patrz http: //stackoverflow.com/faq). Nie należy też prosić ludzi o przeglądanie kodu - należy podać minimalny kod niezbędny do wyjaśnienia, co dokładnie robisz. –

+0

Zdaję sobie sprawę, że zostało to zadane jakiś czas temu, więc powiedziałem, że chcę tylko dodać, że Firefox 11 i kolejne obsługują binarne ArrayBuffer i Blob. – SpliFF

Odpowiedz

19

Gecko11.0 ArrayBuffer wysyłać i otrzymywać wsparcie dla danych binarnych został wdrożony.

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

wysyłania danych binarnych:

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

ODBIORCZA Dane binarne:

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