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

1.9 KiB
Raw Permalink Blame History

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.payloadfileId/fileName/fileSize/mimeType/totalChunks
  • CHUNK.payloadfileId/chunkIndex/data(base64)

边界与注意点

  • Base64 膨胀Base64 会增加体积(约 33%),大文件会更慢;如需优化可改二进制 WebSocket后续增强
  • 并行多文件:以 fileId 隔离缓存即可并行UI 需支持多文件卡片。
  • 断线续传当前协议未定义续传可选增强chunk ack / 断点续传)。