Go语言Web断点续传核心是服务端识别已传分片、校验完整性、有序合并,配合前端按固定大小切片、携带唯一标识(文件名+SHA256前8位+序号)、上传前校验、失败后恢复;服务端用net/http+os实现原子存储(临时文件+重命名)、sync.Map/Redis缓存状态、限流与超时控制、flock加锁合并、摘要验证及定时清理残留分片。

Go语言开发Web断点续传,核心在于服务端识别已上传分片、校验完整性、合并顺序,并配合前端按块上传与进度恢复。不依赖第三方框架,纯net/http + os即可实现,关键是设计好分片标识、状态存储和并发安全的合并逻辑。
客户端分片上传与断点恢复策略
前端需将大文件按固定大小(如5MB)切片,每片携带唯一标识:文件名+Hash(推荐SHA256前8位)+分片序号。上传前先向/upload/check发起GET请求,传入文件Hash和分片序号,服务端返回该分片是否已存在。若存在,跳过上传;若不存在,再用POST上传该分片。上传失败时,前端记录已成功上传的分片序号,刷新后重新拉取已传列表,从第一个缺失序号继续。
服务端分片接收与原子存储
每个分片保存为独立临时文件,路径建议为:./uploads/{file_hash}/{chunk_index}.part。接收时用os.CreateTemp创建带随机后缀的临时文件,写入完成后再os.Rename覆盖目标路径,确保写入原子性。同时用sync.Map或Redis缓存各文件当前已接收的分片序号集合,避免重复接收或漏判。
- 校验分片完整性:比对Content-MD5 Header 或 计算接收后数据的SHA256
- 限制单个IP并发上传数,防止资源耗尽(可用map+time.Now()做简易限流)
- 设置HTTP超时(如30秒),避免大分片阻塞连接
服务端合并逻辑与文件完整性保障
当所有分片上报完成(可通过/merge接口触发,或监听分片上传后自动检查),按序号从小到大读取.part文件,逐个io.Copy追加写入最终文件。合并前先计算所有分片SHA256拼接后的整体摘要(如:sha256(sha256(chunk0)+sha256(chunk1)+...)),与前端预计算的文件总Hash比对,一致才确认合并成功。合并完成后清理所有.part文件。
立即学习“go语言免费学习笔记(深入)”;
- 合并过程加文件锁(
flock)防止多请求并发操作同一文件 - 最终文件名建议用原始名+时间戳+Hash后缀,避免重名覆盖
- 合并失败时保留分片,返回错误并提示前端可重试
状态查询与超时清理机制
提供/upload/status?hash=xxx接口,返回已传分片列表、总分片数、最后上传时间。后台启动goroutine定时扫描./uploads/下超过24小时未完成合并的目录,自动清理残留分片,释放磁盘空间。也可用Redis的EXPIRE为每个上传会话设过期时间,更精准控制生命周期。
- 状态接口响应应包含“是否可合并”字段,前端据此启用“完成上传”按钮
- 清理任务使用
time.Ticker每30分钟执行一次,避免高频扫描 - 清理前先尝试加锁(如在目录下写.lock文件),防止多个实例重复清理
基本上就这些。Golang断点续传不复杂但容易忽略并发安全和校验闭环,把分片标识、原子写入、摘要验证、状态同步四点理清楚,就能稳定支撑GB级文件上传。










