使用Python requests.post上传大文件时连接中断错误的解决方法
解决requests上传大文件时的RemoteDisconnected错误
上传大文件时出现RemoteDisconnected错误,通常是请求超时、内存占用过高或服务器端限制导致的,可通过以下几种方式调整requests设置解决:
1. 延长请求超时时间
requests默认超时时间较短,大文件传输需要更长时间。通过timeout参数分别设置连接超时和读取超时(单位:秒),避免因传输未完成被服务器中断连接:
files ={'compressed_file':open(compressed_file_path,'rb')} values={'Name_Column':column_name} # 连接超时30秒,读取超时300秒(可根据文件大小调整) r = requests.post(url, files=files, data=values, timeout=(30, 300))
2. 使用分块上传(流式传输)
默认情况下requests会将整个文件加载到内存中,大文件会占用大量内存且易引发连接问题。借助requests-toolbelt的MultipartEncoder实现分块上传,避免一次性加载文件:
先安装依赖:
pip install requests-toolbelt
再修改代码:
from requests_toolbelt.multipart.encoder import MultipartEncoder encoder = MultipartEncoder( fields={ 'Name_Column': column_name, 'compressed_file': ('your_file.zip', open(compressed_file_path, 'rb'), 'application/zip') } ) # 带上正确的Content-Type头,同时设置超时 r = requests.post(url, data=encoder, headers={'Content-Type': encoder.content_type}, timeout=(30, 300))
3. 添加重试机制
网络波动可能导致连接中断,通过会话对象配置重试策略,在遇到特定错误时自动重试:
from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry # 创建会话并配置重试规则 session = requests.Session() retry_strategy = Retry( total=3, # 总重试次数 backoff_factor=1, # 重试间隔指数递增 status_forcelist=[429, 500, 502, 503, 504] # 需要触发重试的状态码 ) adapter = HTTPAdapter(max_retries=retry_strategy) session.mount('http://', adapter) session.mount('https://', adapter) # 使用会话发送请求 files ={'compressed_file':open(compressed_file_path,'rb')} values={'Name_Column':column_name} r = session.post(url, files=files, data=values, timeout=(30, 300))
4. 确认服务器端限制
若以上设置无效,需检查服务器端配置:
- 确认服务器允许的最大上传文件大小(如Nginx的
client_max_body_size参数) - 检查服务器的请求超时时间,确保其大于文件传输所需时长
内容的提问来源于stack exchange,提问作者user3160046
相关产品推荐
相关产品推荐

