FileReader буфер, различен от различни сафари

Имам два iPhone, които качват jpg файлове на сървъра Node.js чрез websockets с помощта на socket.io като този

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

Проблемът е, ако всички съвременни качвания на браузъри изглеждат така от страна на 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 } }

Тялото на файла е буфер, на стар iPhone 4, със Safari версия 8, който получавам

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

тук типът тяло не е буфер, пробвах Buffer.alloc() и Buffer.from(), но нямах успех (логично), в случай на отполучавам

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

и в случай наallocтова е

TypeError: Data must be a string or a buffer

p.s. От страна на клиента както на старата, така и на новата версия на safari reader.result е typeof ArrayBuffer, но старото safari има метод на slice в него

въведете описание на изображението тук

p.p.s Но тялото на ArrayBuffers е различно (старо сафари от дясната страна)

въведете описание на изображението тук


person MyMomSaysIamSpecial    schedule 04.10.2017    source източник


Отговори (1)


Причината беше проста, старото Safari не изпраща тялото на файла през WebSockets, така че от страната на сървъра просто ще получите събитие за изпращане на файл, но всъщност без файл.

person MyMomSaysIamSpecial    schedule 15.11.2017