FilePizza|浏览器直传文件的 WebRTC 点对点方案
【免费下载链接】filepizza:pizza: Peer-to-peer file transfers in your browser项目地址: https://gitcode.com/GitHub_Trending/fi/filepizza
当你需要把一个文件交给对方、又不想让内容经过任何第三方网盘或中转服务器时,FilePizza 是一个直接的选择。它是一款基于 WebRTC 的浏览器点对点文件传输工具,上传和下载都发生在两个浏览器之间,文件内容不落盘在中间服务器。选好文件生成一个短链接发给对方,对方浏览器打开链接后传输即开始,速度取决于你和对方的上行带宽。
30 秒跑起来
克隆仓库、安装依赖并启动开发服务器,浏览器打开本机地址就能看到上传页面。默认配置不需要 Redis 和 TURN,开箱即可在本地或局域网内体验。
git clone https://gitcode.com/GitHub_Trending/fi/filepizza cd filepizza pnpm install pnpm dev用 Docker 启动
容器方式包含完整的编排配置,构建后直接拉起即可,停止时运行pnpm docker:down。
pnpm docker:build pnpm docker:up它到底解决了什么问题
传统网盘类工具的模式是"先上传到服务器,对方再下载",文件必然在中间环节停留一次。FilePizza 用 WebRTC 把这条链路拆成了浏览器到浏览器的直连。
点对点直传,文件不经过服务器
服务器只负责在两端之间完成信令和寻址,文件本身从你的浏览器直接流到对方浏览器。对你意味着:传内部文档或隐私资料时,不用担心内容停留在别人的服务器上;传输速度也不受限于中转服务器的出口带宽。
多文件打包成 zip
一次可以选择多个文件上传,下载方收到的是一份 zip 压缩包,而不是逐个文件反复协商。配合 Service Worker 的流式下载,接收端边收边写盘,大文件不必等全部到位才能保存。
密码保护与举报入口
上传时可以为链接加一个可选密码,没有密码的人打开下载页只会看到密码输入框;页面同时提供举报按钮,方便自托管运营者处理违规链接。
移动浏览器也能用
实现基于现代浏览器标准,Mobile Safari 等移动端浏览器同样可以完成传输,对方用手机打开链接就能收文件,不用要求对方装 App。
部署与配置
服务器行为由以下环境变量控制,全部可选:
| 变量 | 默认值 | 作用 |
|---|---|---|
REDIS_URL | 未设置 | 存储通道元数据;不配则回退到内存存储 |
COTURN_ENABLED | 未设置 | 设为true启用 TURN,帮助 NAT 后的两端建立连接 |
TURN_HOST | 127.0.0.1 | TURN 服务器的主机名或 IP |
TURN_REALM | file.pizza | 生成 TURN 临时凭证时使用的 realm |
STUN_SERVER | stun:stun.l.google.com:19302 | 未启用 TURN 时使用的 STUN 地址 |
PEERJS_HOST | 0.peerjs.com | 自托管 PeerJS 服务器的地址 |
PEERJS_PATH | / | 自托管 PeerJS 服务器的路径 |
两个可选项的影响一句话说明:不配 Redis 时状态存在内存里,单实例部署没问题,进程重启后已有链接会失效;不开 TURN 时,如果上传和下载双方都处于 NAT 之后,连接可能建立不起来。
底层怎么工作的(简述)
整个流程分三步建立连接:上传者在浏览器选完文件后,通过 REST 向服务器创建一个通道,服务器返回一个短/长 slug,里面编码了上传者的 PeerJS 标识;下载者打开含 slug 的链接,服务器据此解析出上传者的 PeerJS ID;之后的握手、文件分块与确认全部直接在两台浏览器之间的 WebRTC 数据通道上进行,服务器不再接触任何文件内容。文件按最大 256 KiB 的块发送并逐块确认,保证传输可靠。想读完整消息协议可以看 docs/file-transfer-protocol.md,通道与 slug 的生成逻辑在 src/channel.ts,TURN 凭证生成在 src/coturn.ts。
边界与常见问题
文件大小有限制吗
服务器侧没有限制,理论上只受浏览器内存和双方带宽约束。需要注意的是上传方必须保持浏览器窗口打开,直到传输完成。
可以同时给多人下载吗
可以。把短链接或长链接发给多个人,每个人都会独立与上传方建立一条 WebRTC 连接,互不影响。
关掉浏览器后会怎样
文件链接立即失效,无法再发起新的下载。但已经完成传输的下载方会继续为没下完的人提供种子,部分下载还能补完。
传输内容加密吗
会的。所有 WebRTC 通信经 DTLS 自动进行公钥加密,还可以给上传链接再加一层可选密码作为额外门槛。
为什么有时连接建立不起来
取决于网络环境。任一端在公网或 STUN 可达时握手很快;两端都藏在复杂 NAT 之后又没开 TURN 时,很可能连不上。这是 WebRTC 打洞的固有限制,生产部署建议启用 TURN。
许可与致谢
FilePizza 采用 BSD 3-Clause 许可证 发布。仓库中的披萨插图由 iblowyourdesign 创作,特此致谢。
【免费下载链接】filepizza:pizza: Peer-to-peer file transfers in your browser项目地址: https://gitcode.com/GitHub_Trending/fi/filepizza
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考