如何修复Python中使用Requests库上传大文件时的ChunkedEncodingError?

星瑶君_6704

星瑶君_6704

2026-08-29

490人浏览

原创

chunkedencodingerror通常不是requests的bug,而是服务端提前关闭连接,常见于nginx超时、反向代理限制或后端框架未正确处理流式请求;需通过curl复现、抓包分析及服务端配置(如proxy_read_timeout、flask/django流式接收)协同排查修复。

如何修复python中使用requests库上传大文件时的chunkedencodingerror?

ChunkedEncodingError 通常不是 Requests 的 bug,而是服务端提前关闭连接

当你用 requests.post() 上传大文件(比如几百 MB 以上)时遇到 ChunkedEncodingError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read)),大概率不是你代码写错了,而是服务端在接收过程中主动断开了连接——常见于 Nginx 超时、反向代理限制、或后端框架(如 Flask/Django)未正确处理流式请求。

验证这点最直接的方式:用 curl -X POST -F "file=@large.zip" http://your-api/ 复现相同错误。如果 curl 也失败,基本可锁定服务端问题。

  • Nginx 默认 client_max_body_size 是 1MB,超限会直接返回 413,但若设得过大而 proxy_read_timeout 或 proxy_send_timeout 过短(如默认 60s),就容易触发连接中断
  • Flask 默认不启用流式接收,request.files['file'].read() 会把整个文件读进内存,超时或 OOM 都会导致连接断开
  • Django 的 FILE_UPLOAD_MAX_MEMORY_SIZE 和 DATA_UPLOAD_MAX_MEMORY_SIZE 也会在阈值触发时静默截断

用 requests 的 streaming + timeout 控制避免客户端“误判”断连

Requests 默认会把整个文件读入内存再发出去(除非你手动控制),这对大文件既慢又危险。配合合理的超时和分块读取,能让客户端更稳健地应对网络抖动或服务端延迟。

关键不是关掉 chunked encoding,而是让上传过程可控:

python-parallelization
python-parallelization

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

下载
  • 永远显式设置 timeout:至少包含 (connect_timeout, read_timeout) 元组,例如 timeout=(5, 300)(连接 5 秒,读响应最长 5 分钟)
  • 用 open(..., "rb") + files={"file": (filename, fp, mime_type)} 让 requests 自动流式发送,不要先 read() 整个文件
  • 避免使用 data=... 传二进制内容,它会禁用 chunked encoding 并强制内存加载
  • 如需自定义分块(例如做进度条),可用 iter(lambda: fp.read(8192), b"") 手动迭代,但必须配 stream=True 和手动构造 Content-Length

示例安全写法:

with open("huge.bin", "rb") as f:
    resp = requests.post(
        "https://api.example.com/upload",
        files={"file": ("huge.bin", f, "application/octet-stream")},
        timeout=(5, 600)  # 给足服务端处理时间
    )

服务端必须支持流式接收,否则客户端再稳也没用

客户端发的是 chunked,不代表服务端能接得住。很多 Web 框架默认把整个请求体缓存到内存或临时文件,没等读完就超时或崩溃,导致 TCP 连接被重置——这时 Requests 就报 ChunkedEncodingError。

  • Flask:必须用 stream=True 初始化 request,并手动迭代 request.stream.read(8192);不能碰 request.files 或 request.get_data()
  • Django:用 request.FILES["file"].chunks(chunk_size=8192),别调 .read()
  • FastAPI:参数声明为 UploadFile 即可,默认流式;但注意 file.read() 仍会全量加载,应改用 await file.read(8192) 异步分块
  • Nginx:确认 client_max_body_size、proxy_buffering off、proxy_request_buffering off(后者对大文件上传很关键)

调试时优先抓包看哪一端先断开 TCP 连接

单纯看 Python 报错容易误导。真正要定位的,是三次握手后谁先发 FIN 或 RST。

  • 用 tcpdump -i any port 80 or port 443 -w upload.pcap 抓包,Wireshark 打开后过滤 tcp.analysis.retransmission || tcp.analysis.ack_lost
  • 如果服务端 IP 在上传中途发了 RST,说明它主动终止——查服务端日志、超时配置、OOM killer 记录
  • 如果客户端发了 FIN 后没收到 ACK,可能是本地防火墙、代理或 NAT 设备干扰
  • Requests 的 StreamConsumedError 或 ProtocolError 有时是底层 urllib3 重试失败的残留,关掉重试(requests.adapters.HTTPAdapter(max_retries=0))有助于看清原始错误

大文件上传本质是协同问题:客户端得流着发,服务端得流着收,中间链路得允许长连接。任一环节卡住,都会表现为 ChunkedEncodingError —— 它只是表象,不是病因。

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

相关专题

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

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

2023.07.20

1751

4

python能做什么
python能做什么

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

2023.07.25

4524

7

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

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

2023.07.31

1729

3

python教程
python教程

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

2023.08.03

26617

23

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

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

2023.08.04

3227

5

python eval
python eval

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

2023.08.04

3247

5

scratch和python区别
scratch和python区别

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

2023.08.11

1183

5

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

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

2023.08.10

596

4

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

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

2023.08.11

2523

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习