我在两个浏览器之间有一个数据通道连接,并希望将文件分成多个块并将它们发送到客户端或从客户端发送。
我可以读取文件并将其分解成块。但是我需要一种方法让接收客户知道
数据块所涉及的文件(唯一标识符)。
将块应用于重建(索引号)。
在浏览器中传输二进制数据时,似乎整个有效负载必须是二进制的。因此,我无法创建具有上述属性的JSON对象,并且具有带有实际二进制块的data
属性。
我想我需要将文件块包装到包含标识符和索引的辅助二进制blob中。然后,接收客户端将解码第一个包装器块以检查元数据,然后根据该信息处理实际文件块。
如何在浏览器中执行此操作?我已经做了很多谷歌搜索,但似乎无法找到任何关于此的信息,所以想知道我是否可能忽略了一些可以帮助简化此过程的内容?
答案 0 :(得分:5)
您必须创建自己的传输文件协议。
Blob
/ Uint8Array
个对象。您可能还使用split()
方法来获取块。您只需使用Uint8Array即可传输数据。
创建满足您需求的协议,例如:
发送初始包(例如类型0x01)
发送数据块(例如,类型0x02)
注意:如果要传输多个文件,则应添加ID或其他内容。
在接收方,您可以等待初始包,然后创建一个长度为整个文件的新0-based-chunk-number
。然后,您可以使用set()
在块位置添加收到的数据(偏移= chunk-size
* Blob
)。收到所有块后,您可以创建lmplot
。
答案 1 :(得分:1)
除了@ Robert的非常好的答案,你可以使用channel.send(blob)(至少在Firefox< - > Firefox中)。最终这也适用于Chrome。
答案 2 :(得分:0)
如果只是多个文件的简单问题,您可以为每个新文件创建一个新的数据通道。
每个频道都会处理它自己的缓冲,序列等。
类似的东西:
chan = peerCon.createDataChannel("/somedir/somefile", props);
然后按顺序将文件分成< 64k块和chan.send()
。
接收方可以获取标签并使用它来正确保存文件
peerCon.ondatachannel = function(channel) {
console.log("New file " + channel.label);
channel.onmessage = function(
等
P.S。 如果你真的必须在一个通道上使用文件系统协议(比如因为你想要随机访问行为),不要发明一个新的,使用一个已经存在并经过测试的 - 我喜欢9p来自inferno / plan9