使用Google Drive API批量上传文件报ssl.SSLEOFError错误如何解决
问题成因
ssl.SSLEOFError: EOF occurred in violation of protocol 是SSL连接在传输过程中被意外中断抛出的错误,结合你批量上传的场景,常见诱因如下:
- 短时间内高频次发起上传请求,触发了Google Drive API的速率限制,服务器主动切断超额请求的连接
- 网络链路不稳定,尤其是访问谷歌服务需要代理转发的场景下,代理链路波动很容易导致SSL连接中途断开
- 现有代码没有异常重试逻辑,单次连接失败就直接终止,没有故障恢复能力,所以只能成功上传部分文件
解决方法
你可以按照优先级逐一尝试以下方案:
- 添加异常重试+指数退避逻辑
在上传逻辑中捕获SSL相关错误,失败后间隔一段时间重试,避免单次网络波动就导致上传失败,修改后的上传循环代码示例:
import time from ssl import SSLEOFError # 原有初始化、获取文件列表、创建目标文件夹的逻辑保持不变,仅修改上传循环 max_retry = 3 # 单个文件最多重试3次 for upload_file in f: gfile = drive.CreateFile({'parents': [{'id': a}]}) gfile.SetContentFile(upload_file) is_success = False for retry_cnt in range(max_retry): try: gfile.Upload() print(f'{upload_file} 上传成功') is_success = True break except SSLEOFError: wait_time = 2 ** retry_cnt # 指数退避,依次等待1s、2s、4s后重试,降低触发限流概率 time.sleep(wait_time) if not is_success: print(f'{upload_file} 重试{max_retry}次仍上传失败')
- 控制上传请求频率
在两次上传之间添加固定延迟,把请求频率控制在每秒5次以内,避免触发API限流,可在上传循环末尾添加:
time.sleep(0.2)
- 大文件改用分片上传
如果待上传的文件大小普遍超过10MB,可开启分片上传降低单次连接的传输压力,修改SetContentFile的参数即可:
# chunksize设置为10MB,可根据自身网络情况调整 gfile.SetContentFile(upload_file, chunksize=10*1024*1024)
- 优化网络链路
如果你使用代理访问谷歌服务,可调高代理的超时时间,或者更换更稳定的代理链路,减少连接中途断开的概率。
内容的提问来源于stack exchange,提问作者anh1301
相关产品推荐
相关产品推荐

