2017-10-04 20 views
0

J'ai deux iPhones qui téléchargent des fichiers jpg au serveur via Node.js websockets avec l'aide de socket.io comme celui-ciFileReader tampon différent de différents safari

var reader = new FileReader(); 
reader.onload = function() { 
    socket.emit(
     'chat_file', 
     { 
      body: reader.result 
     } 
    ); 
}; 
reader.readAsArrayBuffer(uploadedFile); 

problème est si tout téléchargement du navigateur moderne ressemble à ceci sur côté Node.js

Oct 04 11:01:01 test-chat1.bnk.ef.lan node[30130]: { name: 'image2.jpg', 
Oct 04 11:01:01 test-chat1.bnk.ef.lan node[30130]: body: <Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 f0 00 f0 00 00 ff db 00 43 00 03 02 02 03 02 02 03 03 03 03 04 03 03 04 05 08 05 05 04 04 05 0a 07 07 06 ... >, 
Oct 04 11:01:01 test-chat1.bnk.ef.lan node[30130]: size: 95712 } } 

corps de fichier est un tampon, sur l'ancien iPhone 4, Safari version 8 Je reçois

Oct 04 11:00:25 test-chat1.bnk.ef.lan node[30088]: { room: '1','image.jpg', body: { byteLength: 889942 }, size: 889942 } } 

ici le type de corps n'est pas un tampon, j'ai essayé Buffer.alloc() et Buffer.from() mais pas de chance (logiquement), en cas de de je reçois

TypeError: First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object. 

et en cas de alloc il est

TypeError: Data must be a string or a buffer 

ps Du côté client à la fois ancienne et la nouvelle version de Safari reader.result est typeof ArrayBuffer mais vieux safari ont la méthode de tranche dans ce

enter image description here

pps Mais ArrayBuffers corps sont différents (vieux safari le côté droit)

enter image description here

Répondre

0

Raison était simple, vieux Safari ne pas envoyer corps de fichiers sur WebSockets, si serveur côté vous aurez juste l'événement sur le fichier en cours d'envoi, mais sans fichier en fait.