断点续传核心是准确记录并恢复文件偏移量,依赖临时文件或目标文件大小获取已下载字节数,HTTP需Range头与206响应,本地传输靠seek()定位,写入须用追加模式并强制fsync,完成后须校验哈希且原子替换文件。
断点续传的核心是记录和恢复文件偏移量
关键不在“断”,而在“续”——必须让程序知道上次传到哪了。常见做法是用一个临时文件(如
)保存已写入的
字节
数,或直接读取目标文件当前大小作为续传起点。HTTP 协议靠
请求头实现服务端分片,而本地文件传输则依赖
定位写入位置。
requests + Range 头实现 HTTP 断点续传
服务端需支持
,否则
请求会返回 200 而非 206。实操时先检查目标文件是否存在,再用
获取已下载字节数,构造请求头:
注意:
值末尾带短横线表示“从该位置到结尾”,不要写成
(你未必知道 total_size)。
收到 206 响应才可续传;若返回 200,说明服务端不支持,得重下
写入文件前必须用
模式,不能用
覆盖
务必校验
响应头中的起始偏移是否匹配预期
本地文件复制的断点续传更简单但易错
本质是
+
+
的组合。难点在于:源文件可能被修改、目标路径权限不足、磁盘空间突然不足。建议步骤:
立即学习
“
Python免费学习笔记(深入)
”;
Trae win
Trae Windows 官方版本现已全面支持 Win10 和 Win11 系统(64位)。国内开发者可直接访问 Trae 中文官网(trae.cn 或 trae.com.cn),一键下载官方正版 .exe 安装包,享受国内直连的高速稳定体验。安装过程极其简便,双击即可运行,并支持一键无缝导入 VS Code 或 Cursor 的原有主题、快捷键及插件配置。登录支持手机号、微信或稀土掘金账号。内置免费的豆包与 DeepSeek 等顶级大模型,让你开箱即用,轻松开启高效的 AI 智能编程之旅。
下载
用
获取源文件总大小
用
获取目标已写大小,确认未超源大小
打开目标文件用
模式,
定位
循环
写入,每次写完立即
和
漏掉
可能导致断电后最后几 KB 丢失,且不会报错。
别忽略校验和与原子性
断点续传完成后,
或
校验不是可选项。更关键的是:不要直接覆盖原文件。正确流程是下载到
→ 校验通过 →
。Windows 下
是原子操作,Linux 下也等效于
。用
或直接
在某些 NFS 或容器挂载场景会失败。
真正麻烦的从来不是“怎么续”,而是“续完怎么信”。校验失败时,是删掉部分文件重来,还是尝试修复?这取决于业务容忍度,但代码里必须有明确分支处理,不能只打印一句“校验失败”。
filename.partRangeseek()Accept-Ranges: bytesRangeos.path.getsize()headers = {"Range": f"bytes={downloaded_size}-"}Rangef"bytes={downloaded_size}-{total_size-1}"open(..., "ab")"wb"Content-Rangeseek()read()write()os.stat(src).st_sizeos.path.getsize(dst)"r+b"fp.seek(downloaded_size)read(8192)fp.flush()os.fsync(fp.fileno())fsyncmd5sha256file.tmpos.replace("file.tmp", "file")replacerenameshutil.moveos.rename