刚开始是想从 Socket.IO 上传文件意外看懂了 base64 上传的方案
关于 Base64 在百度百科上说了, 所以也能懂这个意思
之后看 API 还是有很多格式的样子, FileReader 文档里写的
浏览器端还有 readAsArrayBuffer readAsBinaryString readAsText 几个
前两个只能理解是二进制的文件, 不过这样读了, 服务端应该怎样去用?
在 Node 关于 Buffer 的 API 看有相当多个 API...
不明白... 1, 这么多 API 意义是什么? 2, 怎么和浏览器端的数据格式进行对应呢?
在 StackOverflow 找到了 ArrayBuffer 和 Buffer 对转的代码, 好神奇的样子
function toArrayBuffer(buffer) {
var ab = new ArrayBuffer(buffer.length);
var view = new Uint8Array(ab);
for (var i = 0; i < buffer.length; ++i) {
view[i] = buffer[i];
}
return ab;
}
From ArrayBuffer to Buffer:
function toBuffer(ab) {
var buffer = new Buffer(ab.byteLength);
var view = new Uint8Array(ab);
for (var i = 0; i < buffer.length; ++i) {
buffer[i] = view[i];
}
return buffer;
}
不用这样麻烦吧,socket.io 传附件 客户端:fileReader.readAsBinaryString(newFile); 服务器端: var buffer = new Buffer(fileInfo[fileName][‘data’], ‘binary’); gs.write(buffer, function(err, f){ gs.close(function(err, f){ eventHandler.trigger(‘eUploadAttachmentEnd’) }) }); 我这样存放到gridfs没有问题
@jiyinyiyong 我是读取文件将文件分块传递,服务端接受后将这些块连接起来
newFile = file.slice(filePlace, filePlace + Math.min(块大小, (file.size-filePlace)));
fileReader.readAsBinaryString(newFile);
这个时候触发file.onload,向socket.io服务器推数据, 服务器端 fileInfo[fileName][‘data’] += eventData.data.attachmentData; 如果 data 小于 文件大小 服务器端发消息给客户端继续对余下的部分 直到读完,这样就可以控制进度
@iceblog 这样的话也就是一个 socket.emit 的发送分割成很多个了...
这样中间还要穿插一个局部发送完毕的消息,
觉得比较复杂, 过段时间我也学着写一个看看