【发布时间】:2018-03-15 14:22:13
【问题描述】:
我有两部 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.
在 alloc 的情况下是
TypeError: Data must be a string or a buffer
附言在客户端,旧版和新版 safari reader.result 是 typeof ArrayBuffer 但旧版 safari 中有 slice 方法
p.p.s 但是 ArrayBuffers 主体不同(右侧的旧 safari)
【问题讨论】:
标签: ios node.js safari socket.io buffer