WebSocket不直接支持文件传输,但可通过二进制分片(ArrayBuffer等)配合前后端分块读取、序号校验、缓存合并及心跳机制实现可靠上传;更推荐HTTP上传+WebSocket通知的组合方案。

WebSocket 本身不直接支持文件传输,但可以通过二进制数据(ArrayBuffer、Blob 或 TypedArray)分片发送文件内容,配合前端分块读取 + 后端拼接还原,实现可靠传输。关键在于处理大文件时的分片、序号、校验与粘包问题。
前端:用 FileReader 分块读取并发送
避免一次性加载整个大文件到内存,使用 FileReader 按固定大小(如 64KB)切片读取:
- 获取
File对象(如来自<input type="file">) - 用
slice(start, end)提取每一块,传给FileReader#readAsArrayBuffer() - 读取完成后,将 ArrayBuffer 封装为带元信息的对象(如
{id: 1, total: 5, chunk: buffer})发送 - 建议添加简单重传机制(如超时未收到服务端 ACK 则重发该块)
后端:接收分片并合并存储
以 Node.js + ws 库为例,需维护每个上传任务的上下文:
- 按
message.id和message.total识别同一文件的不同分片 - 用 Map 缓存各文件的已收分片(
Map<uploadid total></uploadid>) - 收到完整分片后,用
Buffer.concat(chunks)合并,并写入磁盘或数据库 - 注意清理超时未完成的上传缓存(如 10 分钟无新分片则丢弃)
增强可靠性:加序号、校验与心跳
纯 WebSocket 不保证顺序和送达,需协议层补充:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
- 每个分片带上递增序号(
seq),客户端按序发送,服务端检查是否跳号/重复 - 可选添加简单校验:如发送前计算
crc32或md5前 8 字节,服务端比对 - 定期发心跳帧(
ping/pong)检测连接状态,断连时触发重传或失败回调 - 服务端收到完整文件后,主动发成功消息(含文件 hash 或 ID),前端据此更新 UI
替代方案:优先考虑 HTTP 上传 + WebSocket 通知
对大多数业务场景,更推荐组合使用而非强依赖 WebSocket 传文件:
- 用
fetch或XMLHttpRequest上传文件(支持进度、断点续传、服务端校验) - WebSocket 仅用于实时通知:上传开始、进度百分比、完成、失败等事件
- 这样既利用 HTTP 的成熟生态,又保留 WebSocket 的实时性,开发和维护成本更低
不复杂但容易忽略的是:浏览器中 WebSocket 的 binaryType 必须设为 "arraybuffer" 才能正确接收二进制;服务端也要明确以二进制模式解析消息,否则可能被转成 UTF-8 字符串导致损坏。

















