headers = {'Range': 'bytes=%d-%d' % (offset, offset + chunk - 1)}
with open(path, 'r+b') as f:
    f.seek(offset)
    n = f.write(resp.content)
    offset += n

下载器中断后从服务端记录的 offset 续传,200MB 的文件下完打不开。十六进制里每隔 1MB 出现一段重复字节,位置正好落在每个分块的边界。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:服务端记录的是已写入长度,客户端发 Range 时又用 offset 减了一,重叠的那一个字节被重复追加。分块循环里每次 += n 写成 += n - 1,误差就按块累积。

「续传 offset 偏移」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

处理上按这个顺序:统一定义 offset 为下一个待写字节的下标 不要出现两种口径;Range 头写成 start=offset end=offset+chunk-1;写完按实际写入字节数推进 offset 并用 tell 核对;续传前后各算一次分块 md5 定位第一处偏差。

确认没问题再收工,续传完成后文件大小和服务端一致 逐块 md5 全部对上 播放器不再报损坏。

作者 9823189