Go 语言需通过自定义 Reader 统计读取字节数、客户端轮询或 WebSocket 推送来实现上传进度反馈;服务端用 sync.Map 存储 uploadID 对应的已读/总量/完成状态,提供 /progress?id=xxx 查询接口。
Go 语言本身不直接提供上传进度回调机制,但可以通过包装 http.Request.Body,配合客户端分块上传(如使用 XMLHttpRequest 或 fetch 的 Upload.onprogress)+ 服务端流式读取 + 实时状态存储,实现文件上传进度的实时反馈。核心在于:**服务端边读边记、客户端定时轮询或用 WebSocket 主动推送**。
关键是在解析 multipart 表单时,对每个文件的 io.Reader 做一层封装,实时统计已读数据量。
io.TeeReader 或自定义 Read 方法,在每次读取后更新共享的进度结构体(如用 sync.Map 存储以 uploadID 为 key 的进度)浏览器原生支持上传过程监听,无需额外库。
FormData 并添加文件和 uploadID 字段XMLHttpRequest.upload.onprogress 获取当前上传进度(注意:这是客户端已发出的字节数,非服务端接收完成量;若需服务端确认进度,仍需后端配合)/api/progress?upload_id=xxx 查询服务端记录的实际写入进度服务端需提供轻量、并发安全的进度暂存和读取能力。
sync.Map 存储活跃上传任务(适合读多写少场景),key 为 uploadID,value 包含 totalSize(预估或客户端传入)、read(已接收字节数)、done(是否完成)等字段GET /progress?id=abc123,返回 JSON:{"uploaded": 1256432, "total": 5242880, "percent": 23.97}
避免轮询开销,适合大文件或高实时性要求场景。
map[string][]*websocket.Conn + 读写锁)