Description
BLOG
- 毕业半年多了,回顾从大学到现在搞过的很有意思的开源项目
- 仿照 AirDrop (隔空投送)优雅地在局域网中传输文件
- 基于 Service Worker 与 Stream API 的浏览器大文件下载方案
FAQ
Q: 在公司内部的局域网无法相互发现以及数据传输。
A: 通常公司内部的网络环境会更复杂,且对称型NAT
无法在公网环境下实现NAT
穿透。这种情况下比较建议在公司内部部署服务,在公司内部通常就不会再存在NAT
,每个设备都会有独立的局域网IP
地址,当然在公司内部网络部署STUN/TURN
也很方便(coturn),都可以解决这个问题。
Q: 某些移动端浏览器无法下载blob:https://xxx
的文件地址。
A: 这是一个优化方向,通过WebRTC
传输的文件更像是流式下载的数据,但是没有Content-Disposition: attachment; filename="name.xxx"
的响应头,此时便不会将其作为文件下载。在这种情况下实际上可以借助Service Worker
来作为后端服务,将数据片转发到SW
后添加attachment
响应头转发回来,可以解决blob://
链接的下载问题,并且还通过实现流式下载避免了超大文件的传输问题。
Q: 即使是在局域网中也无法相互发现设备。
A: 这种情况通常是由于某个设备开启了VPN
,当设备开启VPN
的情况下,设备的IP
地址将会被识别为代理设备的地址,因此会导致两个设备不会识别到同一个房间,导致无法相互发现。在这种情况下可以发现通过输入设备id
是可以连接的,可以据此排查问题,如果还有其他可能导致局域网无法相互发现的问题会在这里继续补充。
Q: 大型文件无法传输,接收大型文件时浏览器会崩溃。
A: 在默认传输模式下,Chrome
会限制内存2GB
左右,Firefox
会限制内存800MB
左右,因此默认模式直接将文件内容暂存于内存的方式,可能会导致浏览器崩溃。当前已基于Service Worker
实现大型文件的流式传输,需要在传输方的接收端的url
加入mode=stream
,例如https://webrtc.touchczy.top/?mode=stream
。如果是自行部署的数据传输服务,需要关注Service Worker
必须要运行在HTTPS
的安全环境下,可以研究下Let's Encrypt
的证书签发。