把文件从桌面拖进网页,就能出现在隔壁电脑的屏幕上——这件事背后没有魔法,只有三层浏览器原生能力:HTML5 Drag & Drop 负责接住文件,File API 负责读取内容,WebRTC DataChannel 负责把内容分块送到对方设备。LanBeam 局域网快传就是把这套能力串成"拖进房间即可共享"的网页应用。下面按你手指一拖的顺序拆开讲。
环节一:拖拽事件如何"接住"文件
浏览器早就内置了拖放协议。当文件被拖到页面上方时会触发 dragover 事件,页面要在这一步阻止默认行为,否则浏览器会直接打开这个文件;文件真正落下时触发 drop 事件,事件对象里的 dataTransfer.files 就是被拖进来的文件列表。
- 拖一个文件和拖一排文件,拿到的都是一个文件列表,这就是"多文件批量投送"的实现基础;
- 列表里每个 File 对象自带文件名、大小、类型,投送到房间后,其他设备看到的文件卡片信息就来自这里。
环节二:File API 如何读出内容
File 对象本质上是一种特殊的 Blob,可以理解为"一段可按需切开的字节"。几个 GB 的视频不可能一次性读进内存,所以实际传输时会把文件切成固定大小的块:用 slice 方法切出一段,读进内存,发出去,再切下一段,循环到文件末尾。
接收端同样以块为单位收数据。桌面浏览器内存充裕,可以边收边把已收到的部分写进磁盘,大文件也不怕;移动浏览器能力受限,超大文件受内存限制,这是需要诚实说明的边界。
环节三:DataChannel 如何把块送到对方
WebRTC DataChannel 是浏览器提供的设备间数据直连通道。建立前双方先协商连接方式,同一局域网内通常直接走局域网链路;数据通道默认强制 DTLS 加密,内容在网络上以密文流动。
发送端按顺序把块写入通道,同时要看着"对面收到了多少"来控制节奏——如果只顾着塞数据,网络跟不上就会越积越多,这个调节机制俗称背压。接收端把块按序拼回,还原出完整文件。页面上显示的传输进度和速度,就是拿"已传块数 ÷ 总块数"算出来的。
三个环节串起来,就是拖拽背后发生的全部:接住文件、切块读取、直连送达。LanBeam 做的,是把这套流程包装成房间里的文件卡片,让不了解协议的人也能一步用上。