如何利用Python实现文件的断点续传功能?

秋墨君_9115

秋墨君_9115

2026-06-07

757人浏览

原创

requests.post()无法断点续传,因http不维护上传状态,每次请求均为全新;需客户端分块发送+告知偏移量,服务端支持追加写入(如content-range或自定义offset参数),并协同校验位置一致性。

如何利用python实现文件的断点续传功能?

为什么直接用 requests 的默认 post 无法断点续传

因为 HTTP 协议本身不维护上传状态,requests.post() 每次都是全新请求,服务端无法知道“这是一半的文件”。断点续传必须由客户端和服务端协同完成:客户端要能分块发送 + 告知偏移量,服务端要能接收并追加写入。常见错误是只在客户端做“分片”,却没和服务端约定如何标识和合并这些分片,结果上传多次后文件内容错乱或覆盖。

  • 服务端必须支持类似 Content-Range 头或自定义参数(如 offset=10240)来接收指定位置的数据
  • 客户端需记录已上传字节数,失败后从该位置继续读取文件,不能重置文件指针
  • 单纯用 seek() 跳过已传部分还不够——还要确保服务端真的写到了对应位置,否则会覆盖或错位

如何用 requests 发送带偏移量的分块请求

核心是控制文件读取 + 构造正确请求头。不要一次性读整个文件,而是用二进制模式打开,按固定大小(如 8192 字节)循环读取,并用 seek() 定位起始位置。关键不是“分片”,而是每次请求明确告诉服务端:“这段数据应写入文件的第 X 字节开始”。

python-parallelization
python-parallelization

将顺序 Python 代码转换为并行/并发实现,用于在需要并行化 Python 代码、提升性能时使用。

下载
  • 使用 with open(path, "rb") as f: 打开文件,避免编码问题
  • 调用 f.seek(offset) 跳转到上次中断处,再用 f.read(chunk_size) 读取
  • 在请求中加入自定义头,如 {"X-Offset": str(offset), "X-Total-Length": str(total_size)};若服务端支持标准 Content-Range,则用 "Content-Range": f"bytes {offset}-{end}/{total_size}"
  • 响应状态码必须检查:200 表示成功,206(Partial Content)常用于分块上传确认,409 或 416 可能表示偏移冲突或越界

如何安全持久化已上传进度(避免重复上传或丢失 offset)

进度不能只存在内存里。网络中断、程序崩溃后,下次启动必须能准确读回上一次的 offset。最简方案是用一个同名的 .progress 文件存纯数字,但要注意写入原子性和并发风险。

  • 写入时先写临时文件(如 file.txt.progress.tmp),再 os.replace() 原子替换,防止读到半截数据
  • 读取前检查该文件是否存在且内容为有效整数,否则从 0 开始
  • 不要把进度存在数据库或远程服务里——这会引入新依赖和单点故障,违背“本地可恢复”原则
  • 上传完成后务必删除进度文件,否则下次会误以为要续传

服务端未提供断点接口时,能否硬套?

不能。如果服务端只是个普通 REST API(比如只接受 multipart/form-data 的单次 POST),强行在客户端分片只会导致服务端每次收到一个“新文件”,最后得到 N 个碎片而非一个完整文件。这时候要么换服务端协议(如改用 tus 协议),要么退回到全量重传 + 校验机制(如上传前计算 sha256,失败后比对服务端已有文件哈希)。

  • tus 协议是事实标准,Python 有 tuspy 库可直接对接支持 tus 的服务端(如 tusd)
  • 若只能用原生 HTTP,必须和服务端开发方确认是否支持 PUT + Content-Range,或是否预留了 offset 参数
  • 别试图用 Range 请求头去“下载式续传”上传——那是针对 GET 的,对 POST 无效
断点续传真正的复杂点不在 Python 代码怎么写,而在于客户端和服务端对“同一段字节应该落在文件哪个位置”的严格一致。哪怕 offset 差 1 字节,最终文件就损坏。所以调试阶段一定要用小文件 + 手动中断 + hexdump 对比,而不是依赖日志里的“上传完成”。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1711

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4364

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1689

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

25517

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3107

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3127

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1163

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2423

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程