FilePizza 上手实践:不走服务器存储的浏览器 P2P 文件直传
【免费下载链接】filepizza:pizza: Peer-to-peer file transfers in your browser项目地址: https://gitcode.com/GitHub_Trending/fi/filepizza
FilePizza 是一个开源的浏览器 P2P 文件传输工具:在浏览器里选好文件后,数据通过 WebRTC 数据通道直接发到接收方浏览器,全程不经过任何服务器存储。它针对的是传统传输服务"先上传到第三方、再让别人下载"带来的等待时间和文件留存问题,适合需要快速把素材或代码发给同事的个人用户,以及希望自建私有传输通道的团队。
FilePizza 是什么:一个只帮你搭桥的文件传输器
FilePizza 的工作方式可以概括为一句话:服务器只做信令,数据不走服务器。发送方浏览器向服务器注册一个频道并得到一个 slug(短 slug 是 8 位随机串,长 slug 是 4 个单词),接收方凭这个 slug 向服务器查询到发送方的 PeerJS 标识符,随后两者建立 WebRTC 数据通道,文件数据在两个浏览器之间直接流动。
这个设计带来两个使用上的特点:
- 频道有生命周期。频道默认 TTL 为 1 小时,发送方页面打开期间会每分钟自动续期;页面关闭时频道随即销毁,链接不再可用(已完成下载的接收方会继续为未完成的接收方续传)。
- 同一个链接可以被多人打开下载,把长链接或短链接发给不同的人即可。
三步把文件发给同事
发送方(共 4 步,第 2 步可选):
- 打开页面,把文件拖进上传区或点击添加。
- 在确认页核对文件列表,需要限制访问时在密码框输入密码,否则留空。
- 点击 Start,页面会生成二维码、长链接和短链接。
- 把链接发给接收方。传输期间页面会实时列出每个下载方的进度,点 Stop 可随时终止整场传输。
接收方(3 步):
- 打开链接,等待与发送方建立连接。
- 若设置了密码,输入正确密码后才会显示文件列表。
- 等待传输完成,浏览器直接保存文件到本地。
两个典型场景:批量传项目文件与保护敏感文件
批量传多个文件时:
- 📦 选择多个文件后,接收方收到的不是零散文件,而是一个 zip 包,zip 流式打包逻辑会在发送过程中边打包边发,不需要先本地压缩。
- 确认页支持逐个移除或继续追加文件,适合把整个项目目录或素材文件夹一次性打包发出。
传输敏感文件时:
- 🔒 密码不是加密算法,而是一道前置门禁:接收方输入密码并验证通过之前,发送方不会告知有哪些文件。密码层叠在 WebRTC 自身的 DTLS 加密之上,即使有人拿到链接,没有密码也看不到文件清单。
无论哪个场景,如果传输中途断掉且发送方页面还开着,接收方重新打开原链接即可从上次确认的字节偏移处继续,协议层通过 Start 消息携带 offset 实现这一点。
传输失败或变慢时先查这三件事
- 发送方页面是否还开着。频道随页面关闭而销毁,链接失效后接收方看到的是页面不存在。若接收方只传了一半而发送方关闭了页面,需要重新发起传输。
- 网络能否打直连。双方都在 NAT 之后(常见于公司网络、移动网络)时,打洞可能失败。自建实例时把
COTURN_ENABLED设为true并配置TURN_HOST,让数据走 TURN 中转即可解决,代价是速度受中转带宽限制。 - 并发下载方数量。所有下载方共享发送方的上行带宽,同时下载的人越多,单个接收方速度越低。
频道与 slug 的服务端存储逻辑见 channel 模块,默认使用 Redis,未配置REDIS_URL时退化为进程内存储,重启即清空。
服务器只存元数据:数据通道里发生了什么
整体交互用一张图说明:
文件在数据通道内按不超过 256 KiB 的分片发送,每片有确认,最后一片以 final 标志收尾。服务器侧只保存"slug → 发送方 PeerJS 标识符"这条映射及其过期时间,文件字节本身从未落盘到任何服务器。完整消息类型与传输时序(含密码流程和断点续传)可参考 传输协议说明,该协议是纯 JSON 消息约定,也可以用于实现兼容的第三方客户端。
一条命令搭好私有实例:Docker 部署 FilePizza
自建实例适合有数据合规要求、或需要稳定 TURN 中转的团队。仓库自带 docker-compose 编排,一次拉起应用、Redis 和 coturn 三个服务:
git clone https://gitcode.com/GitHub_Trending/fi/filepizza cd filepizza pnpm install && pnpm docker:build && pnpm docker:up容器起来后访问http://localhost:8080即可使用。需要调整行为时主要看三个环境变量:REDIS_URL指定频道元数据存放位置,COTURN_ENABLED与TURN_HOST控制是否启用以及中转地址,STUN_SERVER在关闭 coturn 时提供 STUN 发现能力。不想用 Docker 的话,pnpm dev直接起开发环境(dev:full脚本会连同 Redis 和 coturn 一起启动),端口为 3000。
日常临时分享文件,用现成的托管实例最省事;文件性质敏感或传输量大时,自建实例能自己控制 TURN 与存活时间。下一步可以直接按上面的三条命令在本地跑起来,把任意一个测试文件传到手机上,用页面生成的二维码完成一次完整的跨设备传输。
【免费下载链接】filepizza:pizza: Peer-to-peer file transfers in your browser项目地址: https://gitcode.com/GitHub_Trending/fi/filepizza
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考