🚀 纯前端离线局域网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)是


C++单元测试框架选型与实战速查手册
码事漫谈2025/12/3

在C++项目的质量护城河中,单元测试框架的选择如同挑选一把趁手的兵器,它直接决定了测试的效率、可维护性以及与开发流程的契合度。GoogleTest、Catch2和doctest,这三款当今最主流的选择,各有其鲜明的武功路数。本文将为你揭开它们的核心秘籍与实战优劣势,助你一招制胜。 一、框架核心价值定位 1.1 三大框架战略定位分析 维度GoogleTest (v1.14+)Catch2 (v3.5+)doctest

首页编辑器站点地图

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

Copyright © 2026 XYZ博客