1.9 KiB
1.9 KiB
06 - 文件传输(拖拽 / 分片 / 进度 / 下载)
功能目标
- 支持拖拽上传、粘贴文件、发送文件元数据与分片内容。
- 接收端显示进度并可下载(本地重组 Blob)。
前端(Vue)
- 入口组件
FileDropZone.vue:拖拽、粘贴;触发file-selected事件。
- 分片与发送
fileChunker.js:按chunkSize切片(文档示例:64KB)。- 发送流程:
- 生成
fileId - 发送
FILE元数据到/app/room/{roomCode}/message - 循环发送
CHUNK到/app/room/{roomCode}/file/chunk
- 生成
- 进度显示(建议)
- 发送端:
sentChunks / totalChunks - 接收端:
receivedChunks / totalChunks - 通过消息列表中的文件卡片展示(进度条 + 状态:接收中/完成/失败)。
- 发送端:
- 接收与下载(建议实现方式)
- 建立
fileId -> { meta, chunks[] }缓存 - 收到所有分片后,按顺序拼接为
Uint8Array/Blob - 使用
URL.createObjectURL(blob)生成下载链接
- 建立
后端(Spring Boot)
- 转发策略
- 元数据:作为
FILE消息广播到房间 topic。 - 分片:作为
CHUNK消息转发(可用独立 topic 或统一 topic)。
- 元数据:作为
- 限制与风控(建议)
- 单文件最大值(默认 100MB,可配置)。
- 分片大小(默认 64KB,可配置)。
- 频率限制(防止刷分片)。
协议与数据
FILE.payload:fileId/fileName/fileSize/mimeType/totalChunksCHUNK.payload:fileId/chunkIndex/data(base64)
边界与注意点
- Base64 膨胀:Base64 会增加体积(约 33%),大文件会更慢;如需优化可改二进制 WebSocket(后续增强)。
- 并行多文件:以
fileId隔离缓存即可并行;UI 需支持多文件卡片。 - 断线续传:当前协议未定义续传(可选增强:chunk ack / 断点续传)。