请问怎样理解浏览器端和 Node 环境里的各种 Binary 和 Buffer 的数据类型?
发布于 12 年前 作者 jiyinyiyong 6773 次浏览 最后一次编辑是 8 年前

刚开始是想从 Socket.IO 上传文件意外看懂了 base64 上传的方案 关于 Base64 在百度百科上说了, 所以也能懂这个意思 之后看 API 还是有很多格式的样子, FileReader 文档里写的 浏览器端还有 readAsArrayBuffer readAsBinaryString readAsText 几个 前两个只能理解是二进制的文件, 不过这样读了, 服务端应该怎样去用? 在 Node 关于 Buffer 的 API 看有相当多个 API… 不明白… 1, 这么多 API 意义是什么? 2, 怎么和浏览器端的数据格式进行对应呢?

6 回复

在 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没有问题

ArrayBuffer 和 BinaryString 区别是不是不大的?

还有上传进度你有做过么? 想了一下们什么思路的感觉

@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 的发送分割成很多个了… 这样中间还要穿插一个局部发送完毕的消息, 觉得比较复杂, 过段时间我也学着写一个看看

回到顶部