← StraightPath

不经过服务器传大文件:2026 年哪些方案真的能用

传一份 20 MB 的文档早就不是问题了。真正让各种「文件分享」悄悄失效的,是 20 GB:一个数据集、一个剪辑工程、一张磁盘镜像、一个装着 600 个文件的文件夹。这是 2026 年从浏览器出发传大文件的四条路的诚实对照——各付什么代价,以及浏览器点对点在哪里确实不行。

先说结论

如果双方能同时在线,而且谁都不想把文件放到第三方服务器上,那就用 WebRTC 浏览器对浏览器直传:不上传、不再从云上下载一次、没有配额、链接不过期。如果收件方几小时甚至几天之后才会点开,那你就需要存储,服务器是对的工具——只要清楚自己付的是这笔钱。

四条路对照

方式字节住在哪实际上限你要付的代价
邮件附件两个邮箱,加上中间每一台中继25 MB,有时 10 MB没有别的代价——所以上限才压得这么低
网盘 / 快传服务链接服务商的服务器,直到链接过期看套餐,2–200 GB账号、上传时间、服务商的下行流量额度,以及一个持有你文件的第三方
对象存储 + 预签名 URL你自己的桶事实上无限你要维护一套后端、每次下载付流量、还要管凭证
浏览器点对点(WebRTC)哪都不在,中间没有存放点发件方的磁盘与收件方的磁盘双方全程都得在线;发件方的上行带宽就是上限

为什么浏览器现在做得到这件事

是五个 API 落地之后,第四条路才从「演示」变成了「能用」:

「无服务器」仍然要有人交换电话号码

两台浏览器没法凭空在公网找到彼此:总得有个地方把会话描述和 ICE candidate 递给对方,这就是信令,也是整个流程里唯一接触第三方的环节。选项要么是自己跑一个 WebSocket 中继,要么用公共的。StraightPath 用公共的 Nostr relay——一个消息广播网络,正好适合这种小而短暂、无需登录但带密钥的流量——再加上公共 STUN 和默认关闭的 TURN 中转。

关键在于:信令里一个文件字节都没有。加密密钥也不在里面,密钥在 URL 片段(#k=…)里,而浏览器不会把片段发给服务器、不会写进 Referer,在这个应用里连地址栏和历史记录都不写。观察信令的一方只能看到一个房间号和一堆密文。

点对点确实更差的地方,直说

一步一步:一个 10 GB 的文件夹,浏览器到浏览器

  1. 发件方打开页面,把文件夹拖进去。没有任何东西被上传——浏览器在本地读文件,一块一块地算进 Merkle 树。
  2. 页面给出链接和二维码。这个链接就是完整的投递:房间号加密钥。
  3. 收件方打开链接。浏览器用密钥解开清单——文件名、大小和预期的根值都是密封的,旁观者什么都学不到——然后开始按块请求。
  4. 块流入、解密、立刻写入 OPFS。内存保持平稳,磁盘占用恰好等于已收到的量。
  5. 最后一个字节到了,收件方在本地全量重算 Merkle 根,和清单里那个密封值比对。校验是一次完整的重读,故意不信任产出这些字节的接收路径。
  6. 收件方导出成真正的文件夹。如果中途关了页面,重新打开时会问你:是补齐剩下的块,还是删掉已到的部分从头再来。

排查

收件方那边毫无反应。
十次里有九次是发件方把标签页关了。这次投递只和创建它的那个页面同寿命。
连上了,但快不起来。
先查发件方的上行速度——那是上限。两端都在办公网或运营商 NAT 后面的话,到「高级」里打开 TURN,用一点速度换一条走得通的路。
校验失败。
客户端会有上限地重拉出问题的块,然后停下来明说,而不是无限循环。真正的失败意味着发件方的文件在传输途中被改过(重新分享一次),或者 flight 上有块被损坏了——Merkle 根存在的意义正是让这种事不能悄悄过去。
它在吃我的磁盘。
收到的块就是你磁盘上的真实字节,直到你导出并清理。一个好客户端会把这个数字显示出来,并给一个能把空间还回去的按钮。
链接能贴到群里吗?
可以,但要把它当成秘密:链接里含密钥。任何人在发件方在线时打开它,都能收到文件。缓解办法是让投递短命,并且走私聊。

该用哪个

25 MB 以内、只有一个收件方:老实说,邮件。收件方稍后才出现、或者需要一个长期有效的链接:网盘,然后为存储付钱。你在搭基础设施、要程序化控制:对象存储加预签名 URL。双方都在线、文件很大、你更希望字节直接过去:浏览器点对点——也就是StraightPath存在的理由。