我在两个浏览器之间具有datachannel连接,并希望将一个文件分解成块并将其发送给/从客户端发送。
我可以读取文件并将其分解成块。但是,我需要一种让接收客户知道
的方法哪个文件块与(唯一标识符)有关。
将块适用于重建(索引编号)。
在浏览器中传输二进制数据时,似乎整个有效载荷必须是二进制的。因此,例如,我不能使用上述属性创建一个JSON对象,并且具有带有实际二进制块的data
属性。
我想我需要将文件块包装到包含标识符和索引的辅助二进制斑点中。然后,接收客户端将解码第一个,包装器,块以检查元数据,然后根据该信息处理实际文件块。
我该如何在浏览器中执行此操作?我已经进行了很多Google搜索,但似乎找不到有关此信息的任何信息,所以想知道我是否可能忽略了可以帮助缓解此过程的东西?
您必须创建自己的传输文件协议。
- 我假设您有一个
File
/Blob
对象。您可能还使用split()
方法来获取块。 -
您可以简单地使用uint8array传输数据。
-
创建一个满足您需求的协议,例如:
- 1个字节:软件包类型(255个可能的软件包类型)
- 2个字节:数据长度(2^16字节〜64kb的数据)
- n字节:< data>
-
发送初始软件包(例如类型0x01)
- 数据包含一些信息(全部或某些):
- 斑点/文件的总长度
- 文件类型
- 块大小
- 块数量
- 文件名
- ...
- 数据包含一些信息(全部或某些):
-
发送数据块(例如类型0x02)
- 您应该将至少两个字节用于序列号
- 随后遵循数据(由于您知道总长度而不需要长度)
-
注意:如果传输多个文件,则应添加一个ID或其他内容。
在接收方侧面,您可以等待初始软件包,并创建一个具有总文件长度的新Uint8Array
。之后,您可以使用set()
在块位置添加接收到的数据(OFFSET = 0-based-chunk-number
* chunk-size
)。收到所有块时,您可以创建Blob
。
除了 @Robert的好答案外,您还可以使用channel.send.send.send(blob)(至少在Firefox< -> Firefox中)。最终,这也应该在Chrome中起作用。
如果这是多个文件的简单问题,则可以为每个新文件创建一个新的数据通道。
每个通道都会照顾自己的缓冲,序列等。
类似:
chan = peerCon.createDataChannel("/somedir/somefile", props);
然后将您的文件分解为< 64k块,然后按顺序进行chan.send()
。
接收方可以获取标签并使用它来保存文件
peerCon.ondatachannel = function(channel) {
console.log("New file " + channel.label);
channel.onmessage = function(
等。
P.S。如果您确实必须通过单个通道使用文件系统协议(例如,因为您想要随机访问行为)不要发明新通道,请使用已经存在并经过测试的通道 - 我喜欢Inferno/plan9