Files
quick-share/docs/06-文件传输(拖拽-分片-进度-下载).md

43 lines
1.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 06 - 文件传输(拖拽 / 分片 / 进度 / 下载)
## 功能目标
- 支持拖拽上传、粘贴文件、发送文件元数据与分片内容。
- 接收端显示进度并可下载(本地重组 Blob
## 前端Vue
- **入口组件**
- `FileDropZone.vue`:拖拽、粘贴;触发 `file-selected` 事件。
- **分片与发送**
- `fileChunker.js`:按 `chunkSize` 切片文档示例64KB
- 发送流程:
1. 生成 `fileId`
2. 发送 `FILE` 元数据到 `/app/room/{roomCode}/message`
3. 循环发送 `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/totalChunks`
- `CHUNK.payload``fileId/chunkIndex/data(base64)`
## 边界与注意点
- **Base64 膨胀**Base64 会增加体积(约 33%),大文件会更慢;如需优化可改二进制 WebSocket后续增强
- **并行多文件**:以 `fileId` 隔离缓存即可并行UI 需支持多文件卡片。
- **断线续传**当前协议未定义续传可选增强chunk ack / 断点续传)。