我有两个iPhone,在socket.io的帮助下通过websockets将jpg文件上传到Node.js服务器
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.
如果分配,则为
TypeError: Data must be a string or a buffer
P.S。在客户端,新旧版本的safari reader.result 是 ArrayBuffer 的类型,但旧的safari中有切片方法
p.p.s但是 ArrayBuffers 正文是不同的(右侧是旧的野生动物园)
答案 0 :(得分:0)
原因很简单,旧的Safari不会通过WebSockets发送文件正文,所以服务器端你只会得到关于文件发送的事件,但实际上没有文件。