⚡ LanBeam 局域网快传

浏览器拖拽传文件是怎么实现的

从 HTML5 Drag & Drop 到 File API、分块读取与 DataChannel,拆解拖拽互传的技术细节。

把文件从桌面拖进网页,就能出现在隔壁电脑的屏幕上——这件事背后没有魔法,只有三层浏览器原生能力:HTML5 Drag & Drop 负责接住文件,File API 负责读取内容,WebRTC DataChannel 负责把内容分块送到对方设备。LanBeam 局域网快传就是把这套能力串成"拖进房间即可共享"的网页应用。下面按你手指一拖的顺序拆开讲。

环节一:拖拽事件如何"接住"文件

浏览器早就内置了拖放协议。当文件被拖到页面上方时会触发 dragover 事件,页面要在这一步阻止默认行为,否则浏览器会直接打开这个文件;文件真正落下时触发 drop 事件,事件对象里的 dataTransfer.files 就是被拖进来的文件列表。

环节二:File API 如何读出内容

File 对象本质上是一种特殊的 Blob,可以理解为"一段可按需切开的字节"。几个 GB 的视频不可能一次性读进内存,所以实际传输时会把文件切成固定大小的块:用 slice 方法切出一段,读进内存,发出去,再切下一段,循环到文件末尾。

接收端同样以块为单位收数据。桌面浏览器内存充裕,可以边收边把已收到的部分写进磁盘,大文件也不怕;移动浏览器能力受限,超大文件受内存限制,这是需要诚实说明的边界。

环节三:DataChannel 如何把块送到对方

WebRTC DataChannel 是浏览器提供的设备间数据直连通道。建立前双方先协商连接方式,同一局域网内通常直接走局域网链路;数据通道默认强制 DTLS 加密,内容在网络上以密文流动。

发送端按顺序把块写入通道,同时要看着"对面收到了多少"来控制节奏——如果只顾着塞数据,网络跟不上就会越积越多,这个调节机制俗称背压。接收端把块按序拼回,还原出完整文件。页面上显示的传输进度和速度,就是拿"已传块数 ÷ 总块数"算出来的。

三个环节串起来,就是拖拽背后发生的全部:接住文件、切块读取、直连送达。LanBeam 做的,是把这套流程包装成房间里的文件卡片,让不了解协议的人也能一步用上。

现在就试试:浏览器打开 LanBeam,拖入文件即可共享给同网设备 免费打开 LanBeam →

常见问题

拖拽和点"选择文件"上传有区别吗?

对传输本身没有区别,两种方式最终都拿到同样的 File 对象。拖拽的优势在交互:批量传多个文件时更顺手,也省去了打开文件选择框的步骤。

分块传输会导致文件损坏吗?

不会。接收端按发送顺序把块重新拼接,顺序由数据通道保证,拼完就是原文件的逐字节副本。文件没传完之前打不开,是正常现象。

传输经过服务器中转吗?

不经过。文件内容走 WebRTC DataChannel 设备直连,服务器只负责房间信令和文件名清单;同一局域网内,数据直接跑局域网带宽,速度取决于路由器和网卡。

为什么手机浏览器传超大文件容易失败?

移动浏览器内存有限,无法像桌面那样边收边存盘,超大文件受内存限制。文档、照片、常规视频一般没有问题,几个 GB 的素材建议用电脑接收。