FilePizza浏览器P2P直传文件:3步免中继,大文件浏览器直接传
【免费下载链接】filepizza:pizza: Peer-to-peer file transfers in your browser项目地址: https://gitcode.com/GitHub_Trending/fi/filepizza
传个视频给同事,先传到网盘,对方再登录下载——慢,而且文件留在了别人服务器上。FilePizza 用浏览器 P2P 文件传输解决了这个问题:双方各开一个网页,通过 WebRTC(浏览器内置的点对点通信技术)直连,文件数据从一个浏览器直接进另一个浏览器,不经过任何服务器存储。
初见印象:服务器只发"门牌号"
- 零存储:文件不落盘服务器
- 浏览器直传:WebRTC 点对点通道
- 链接分享:一个短 slug 可发多人
- 移动端可用:Mobile Safari 也支持
- 密码保护:可选的额外一层
拆解原理:slug 像门牌号,数据走暗道
把服务器想象成前台:它只负责发"门牌号"和指路,不碰行李本身。上传者创建频道时,服务器生成一个 slug——这个字符串里编码了上传者的 PeerJS(封装了 WebRTC 信令的库)标识。下载者拿着 slug 找服务器,服务器把标识"翻译"给他,之后两人的所有消息就绕开服务器,直接走 WebRTC 数据通道。完整消息定义见传输协议文档。
一次传输的关键流程:
- 上传者选文件,服务器创建频道并返回 slug
- 分享链接(含 slug)发给下载者
- 下载者凭 slug 向服务器解析出上传者标识
- 双方建立 DTLS 加密的 WebRTC 数据通道
- 文件按 256KB 分块发送,接收方逐块回执确认
上手体验:3步完成一次传输
- 打开页面,上传者选择文件
- 需要时勾选并填写密码
- 把生成的链接发给接收方
- 接收方打开链接,点击开始下载
- 双方盯着进度条,传输结束点保存
- 注意:上传者全程别关页面
体现巧思的细节
多文件自动打包成 zip
一次选多个文件,接收方拿到的是一份 zip 包。打包逻辑在 src/zip-stream.ts 里采用流式写法,边压边发,不把整个压缩包攒在内存里。
断点续传:Pause 与按偏移续传
下载中途断了或主动暂停,重连后带着"已确认偏移量"重新发 Start 消息,传输从上次停下的位置继续,不用从头再来。
密码保护:握手多两步
设置密码后,下载者的 RequestInfo 会先收到 PasswordRequired,再用 UsePassword 提交密码;错了就再要一次,对了才放文件元数据。
私有部署:三条命令
$ git clone https://gitcode.com/GitHub_Trending/fi/filepizza $ pnpm install $ pnpm dev本地跑默认用内存存储,重启即清空;要持久化配REDIS_URL,公网部署跨 NAT 时再配好 TURN(COTURN_ENABLED=true加TURN_HOST等变量)。
快速答疑
Q:传一半能关浏览器吗?不能。上传者关页后链接立即失效,未完成的下载中断;已下载完的人还可以继续给未完成的人"补传"。
Q:能传多大的文件?没有硬性上限,瓶颈在浏览器内存和设备性能,几 GB 内一般都没问题。
Q:传输是加密的吗?是。WebRTC 通道默认经 DTLS 公钥加密,再加可选密码是双保险。
FilePizza 的价值很直白:把"上传—中转—下载"砍成"直传",省掉中间存储的等待和隐私风险,代价是上传方必须在线盯着进度。它用 Next.js + React + TypeScript 写界面,靠 PeerJS 处理 WebRTC 信令与连接,React Query 管状态,Redis 只是可选的元数据存储——整个系统轻得刚好够用。
【免费下载链接】filepizza:pizza: Peer-to-peer file transfers in your browser项目地址: https://gitcode.com/GitHub_Trending/fi/filepizza
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考