🚀 纯前端离线局域网P2P大文件断点传输:别让你的照片墙崩了

作者:子兮曰日期:2026/1/23

前言:小明和他的照片墙危机

想象一下,你是小明,一个热爱摄影的程序员。周末去爬山拍了一堆4K高清照片,总共3GB,准备发给老婆分享。微信传?算了,压缩后画质渣得像像素风。网盘?离线状态下连不上。蓝牙?慢得像蜗牛在跑步。你急得团团转,突然灵机一动:用电脑直接传啊!可是怎么在浏览器里实现局域网P2P大文件传输,还得支持断点续传?别急,今天咱们就聊聊这个技术方案。

技术背景:P2P不是什么新鲜玩意儿

P2P(点对点)传输在局域网里其实挺常见的,BT下载就是经典案例。但咱们今天聊的是纯前端实现,意思是完全不用后端服务器,用户A直接把文件传给用户B。核心技术是WebRTC(Web Real-Time Communication),这货本来是用来视频聊天的,但咱们可以拿来传文件。

为什么选WebRTC?因为它支持数据通道(DataChannel),可以直接在浏览器间建立连接。加上File API和Blob,咱们就能把大文件切成小块,边传边收,断点续传自然就出来了。

核心实现:分块传输 + 断点续传

1. 文件切块:大象塞冰箱,得先切成块

浏览器处理大文件有个硬伤:内存限制。如果直接把3GB文件读进内存,Chrome得哭爹喊娘。所以咱们用FileReader分块读:

1// 文件分块函数
2function chunkFile(file, chunkSize = 1024 * 1024) { // 1MB每块
3  const chunks = [];
4  let offset = 0;
5  
6  while (offset < file.size) {
7    const chunk = file.slice(offset, offset + chunkSize);
8    chunks.push(chunk);
9    offset += chunkSize;
10  }
11  
12  return chunks;
13}
14

这里用file.slice()切块,每个块1MB。为什么要1MB?平衡传输效率和内存占用,太小网络开销大,太大浏览器卡。

2. WebRTC连接:建立地下通道

WebRTC连接需要信令服务器(用来交换连接信息),但咱们是离线局域网,所以可以用WebSocket或者直接用浏览器本地存储交换SDP(会话描述协议)。

1// 创建RTCPeerConnection
2const pc = new RTCPeerConnection({
3  iceServers: [] // 局域网不需要STUN服务器
4});
5
6// 创建数据通道
7const dataChannel = pc.createDataChannel('file-transfer');
8
9// 监听连接事件
10dataChannel.onopen = () => console.log('通道开了,可以传文件了');
11dataChannel.onmessage = handleMessage;
12

3. 断点续传:从中断处继续

断点续传的关键是记录已传块的进度。用IndexedDB或者localStorage存进度:

1// 发送文件块
2async function sendFileChunks(file, dataChannel) {
3  const chunks = chunkFile(file);
4  const progress = loadProgress(file.name) || 0; // 从本地加载进度
5  
6  for (let i = progress; i < chunks.length; i++) {
7    const chunk = chunks[i];
8    const arrayBuffer = await chunk.arrayBuffer();
9    
10    // 发送块数据,带上索引
11    dataChannel.send(JSON.stringify({
12      type: 'chunk',
13      index: i,
14      data: arrayBuffer
15    }));
16    
17    saveProgress(file.name, i + 1); // 保存进度
18  }
19  
20  // 发送结束信号
21  dataChannel.send(JSON.stringify({ type: 'end' }));
22}
23

接收端收到块后,先存到临时数组,收到'end'信号再合并成完整文件。

浏览器限制:那些坑爹的现实

1. 文件大小限制:Chrome说不行就不行

Chrome对单个文件上传有限制,默认是2GB。有些版本甚至更低。遇到大文件怎么办?继续分块,但块数太多会影响性能。

解决方案:用File System Access API(Chrome 86+),可以直接操作本地文件系统,绕过内存限制。

1// 使用File System Access API
2const fileHandle = await window.showOpenFilePicker();
3const file = await fileHandle.getFile();
4const writableStream = await fileHandle.createWritable();
5
6// 分块写入
7for (const chunk of chunks) {
8  await writableStream.write(chunk);
9}
10await writableStream.close();
11

2. 内存泄漏:传着传着浏览器崩了

大文件传输时,如果不及时释放Blob对象,内存会爆。解决方案:用stream API边读边传:

1// 用ReadableStream处理大文件
2const stream = file.stream();
3const reader = stream.getReader();
4
5while (true) {
6  const { done, value } = await reader.read();
7  if (done) break;
8  
9  // 直接发送value(Uint8Array)
10  dataChannel.send(value);
11}
12

3. 网络限制:局域网防火墙挡道

公司局域网可能有防火墙,WebRTC的UDP连接会被挡。解决方案:降级到WebSocket,或者用TURN服务器中转(但这就不纯前端了)。

实战案例:三个真实场景

案例1:照片分享应用

我之前做的一个家庭相册App,用这个技术实现了局域网照片同步。妈妈在客厅电脑上传相册,爸爸在卧室就能直接收到,不用连路由器。

关键代码:进度条显示 + 错误重试

1// 进度显示
2dataChannel.onmessage = (event) => {
3  const message = JSON.parse(event.data);
4  if (message.type === 'progress') {
5    updateProgressBar(message.percent);
6  }
7};
8

案例2:游戏存档同步

做游戏开发时,团队成员在局域网同步大存档文件(几GB)。用断点续传,网络断了重连后从断点继续,省去了重传的时间。

案例3:视频剪辑素材传输

剪辑师在局域网传4K视频素材。传统方法用U盘慢,用这个方案直接浏览器传,还能显示传输速度和剩余时间。

其他方案:当WebRTC不够用时

方案1:WebTorrent

基于WebRTC的BitTorrent实现,支持多对多传输,更适合大文件群发。

1import WebTorrent from 'webtorrent';
2
3const client = new WebTorrent();
4client.seed(file, (torrent) => {
5  console.log('种子创建成功:', torrent.magnetURI);
6});
7

优点:多人同时下载快。缺点:需要种子文件管理。

方案2:Socket.IO + 二进制传输

用WebSocket传二进制数据,配合socket.io实现断点续传。

1const socket = io();
2socket.emit('send-file-chunk', { chunk, index });
3
4socket.on('chunk-received', (index) => {
5  // 继续发下一块
6});
7

优点:兼容性好。缺点:需要服务器中转。

方案3:Electron应用

如果纯浏览器限制太多,可以做个Electron桌面应用,用Node.js的fs模块直接操作文件系统,结合WebRTC。

总结与展望

纯前端P2P大文件断点传输,听起来高大上,其实就是把文件切块 + WebRTC传数据 + 本地存储进度。浏览器限制是客观存在的,但通过File System API和内存管理,大部分场景都能搞定。

未来,随着WebTransport协议的普及(基于HTTP/3),传输效率会更高。5G和WiFi 6普及后,局域网传输速度会飞起。

下次老婆让你传照片,别再抱怨网速了,直接用浏览器P2P传吧!有什么问题,评论区见。🚀


🚀 纯前端离线局域网P2P大文件断点传输:别让你的照片墙崩了》 是转载文章,点击查看原文


相关推荐


【云计算】利用 LVS 构建集群实现负载均衡 | 集群的概念 | 单服务器性能瓶颈验证例子 | LVS 基础 | LVS 构建负载均衡集群实操步骤
王平渊2026/1/15

利用 LVS 构建集群实现负载均衡 LVS 是构建高性能、高可靠负载均衡集群的利器,其内核态转发机制和丰富的调度算法,使其成为大规模集群场景的首选方案。在实际应用中,需根据业务场景选择合适的工作模式(DR 模式为最优选择),并结合 Keepalived 实现高可用,最终解决单服务器的性能瓶颈问题。 Ⅰ. 集群(Cluster)基础 0x00 集群的概念 集群(Cluster),是一组相互独立且相互依赖、通过高速网络互联的计算机组成的计算机组,以单一模式加以管理,为用户提供统一服务。 从用户视角


Excel/WPS 表格数据合并操作指南
GalenZhang8882026/1/6

Excel/WPS 表格数据合并操作指南 场景一:同一个文件,不同工作表(Sheet) 适用情况:数据都在同一个 Excel 文件里,比如在 Sheet1 和 Sheet2,都有共同的 A列 作为关联。 1. 推荐公式:XLOOKUP 公式示例: =XLOOKUP(A2, Sheet2!A:A, Sheet2!D:D) 2. 参数详细说明 A2(查找值): 当前表格(Sheet1)中你要拿去匹配的那个单元格(通常是 ID、姓名等)。Sheet2!A:A(查找数组): 去哪里找这个 ID?即 S


MySQL 版本演进全景图:从 5.6 到 8.4 的技术变革与行业实践
刘一说2025/12/29

文章目录 一、版本演进时间线概览二、核心功能迭代:从基础架构到现代数据库1. 数据类型与存储引擎革新2. 查询语言与计算能力3. 事务与一致性 三、架构与性能优化:从单机到云原生1. 复制与高可用2. 性能调优 四、安全与兼容性:从传统认证到现代密钥管理1. 认证机制演变2. 加密与审计 五、典型场景适配建议六、未来趋势与行业挑战结语 一、版本演进时间线概览 版本发布时间核心突破行业定位5.62013年在线 DDL、性能优化传统 OLTP 基础架构5.7201


前端原生能力速查笔记(HTML + 浏览器 API 实战篇)
遇见~未来2025/12/20

本笔记用于整理前端开发中不依赖框架即可实现的高频实用功能,涵盖文件下载、打印、HTML 原生属性以及浏览器内置 JS API。 适合作为:日常开发速查 / 基础能力沉淀 / 新人教学笔记 一、a 标签文件下载功能 1. 核心原理 利用 HTML5 的 download 属性, 让浏览器在点击链接时触发下载行为,而不是直接预览资源。 2. 基础用法 <!-- 直接下载(使用原文件名) --> <a href="files/demo.pdf" download>下载 PDF</a> <


自主高性价比、高精度车规级姿态感知、倾角感知模组-应用消费级无人机、自动驾驶、机器人、智能制造、基础设施、智能穿戴等
moonsims2025/12/12

自主高性价比、高精度车规级姿态感知、倾角感知模组-应用消费级无人机、自动驾驶、机器人、智能制造、基础设施、智能穿戴等 在小说阅读器中沉浸阅读 IMU 惯性测量单元(Inertial Measurement Unit) 是测量物体三轴角速度和加速度的设备。一个IMU内可能会装有三轴陀螺仪和三轴加速度计,来测量物体在三维空间中的角速度和加速度。严格意义上的IMU只为用户提供三轴角速度以及三轴加速度数据。 VRU 垂直参考单元(Vertical Reference Unit)是


Bun 卖身 Anthropic!尤雨溪神吐槽:OpenAI 你需要工具链吗?
也无风雨也雾晴2025/12/3

Anthropic 收购 Bun,Claude Code 半年营收破 10 亿美元 今天刷推的时候看到一条爆炸新闻:Anthropic 把 Bun 给收了。 是的,就是那个号称"比 Node.js 快得多"的 JavaScript 运行时。这也是 Anthropic 成立以来的第一笔收购。 更劲爆的是,官宣的同时还顺便秀了一把肌肉——Claude Code 上线半年,年化收入已经突破 10 亿美元。 网友速度很快,恶搞图已经出来了:Bun 屁股上印着 Claude 的 logo 先说说 Cla


AI - 通过 Docker 来安装与访问 OpenClaw
LinXunFeng2026/2/2

欢迎关注微信公众号:FSA全栈行动 👋 一、简介 这是我在 Mac 上通过 Docker 来安装和配置 OpenClaw 的一份记录,随着文章从上到下一步步做就可以了。 二、docker 拉取 Ubuntu 镜像 docker pull ubuntu:latest 创建容器 创建容器,并映射 18789 端口 docker run -it -p 18789:18789 --name openclaw ubuntu 搭配 Docker 容器的分离快捷键,先按 Ctrl+P,再按 Ctrl+


英语语法笔记:英语不应该成为开发工程师的发展瓶颈
修己xj2026/2/11

前几天,是公司成立二十周年的年会。老板作了一场题为《穿越寒冬,求实存善》的演讲。那一刻我在想:当寒意渐浓,作为领航者,他思考的是如何带领公司扛过这场冬天;那作为程序员的我们,又该如何穿越自己的寒冬呢? Vue 作者尤雨溪曾坦言:“不仅英语差会成为瓶颈,英语好还能成为优势,因为学习效率会比别人高。像我这样半路出家自学的人,只能靠英语了……”确实,无论是阅读技术文档、参与开源社区、在 Stack Overflow 寻找答案,还是追踪最新技术资讯、争取一份远程机会,英语早已不是可选项,而是必修课——是


QT & QML 总结备查
瞰百2026/2/19

QT & QML 总结备查 首要注意,在桌面端开发QT可免费商用,而嵌入式端QT商用则收费。 各种 UI 库的总结和对比: Cpp-Learning/C-C++实用库备查.md at main · Staok/Cpp-Learning。 文章所在 Github 仓库 Staok/QT-QML-Learning: QT & QML 总结备查文章 会保持最新,其它地方的不会跟进。 常看常新 QT 安装:网搜 Qt Creator 下载和安装即可。 编译器:对于 Win 上


程序员的明天:AI 时代下的行业观察与个人思考
勇哥Java实战2026/2/27

这篇文章分享了我对 AI 时代下,软件行业发展以及程序员命运走向的 5 点思考,供大家参考。 1 匠人时代落幕 Redis 之父 antirez,最近写了一篇文章 《 Don't fall into the anti-AI hype 》,读完之后,我深有感触。 文章的观点非常明确: AI 不仅改变了编码方式,更重塑了软件行业的价值结构和职业路径,程序员需要从“手动编码”转向“设计系统与与 AI 协作” 。 过去的软件行业,其实有一种很典型的“匠人红利”。谁代码写得更优雅,谁框架更熟,谁对某个

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客