共计 2105 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点:为什么文件下载会失败?
在使用 ChatGPT API 下载文件时,开发者常遇到以下几种典型问题:

- 网络波动 :API 服务器位于海外,国内直接连接时容易因网络不稳定导致连接中断
- 大文件超时 :默认请求超时设置(通常 30 秒)无法满足大文件下载需求
- 格式限制 :某些特殊格式文件可能触发 API 的内容安全检测机制
- 速率限制 :免费账户每分钟 / 每天的请求次数有限制
技术方案横向对比
原生 API 直接下载的问题
- 单次请求获取完整文件内容
- 无自动重试机制
- 内存占用高(需完整加载文件到内存)
分块下载优势
- 基于 HTTP Range 请求(状态码 206)
- 支持按指定字节范围获取文件片段
- 内存友好(每次只处理部分数据)
断点续传关键设计
- 记录已下载的字节位置
- 校验分块完整性(MD5/SHA1)
- 异常时从最后成功位置继续
Python 实现方案
基础版(带重试机制)
import requests
from time import sleep
def download_file_with_retry(url, save_path, max_retries=3):
"""
带重试机制的文件下载
:param url: 文件下载 URL
:param save_path: 本地保存路径
:param max_retries: 最大重试次数
"""
for attempt in range(max_retries):
try:
response = requests.get(url, stream=True, timeout=60)
response.raise_for_status()
with open(save_path, 'wb') as f:
for chunk in response.iter_content(1024*1024): # 1MB chunks
f.write(chunk)
return True
except requests.exceptions.RequestException as e:
print(f"Attempt {attempt + 1} failed: {str(e)}")
if attempt < max_retries - 1:
sleep(2 ** attempt) # 指数退避
continue
return False
分块下载进阶版
def chunked_download(url, save_path, chunk_size=1024*1024):
headers = {'Range': 'bytes=0-'}
downloaded = 0
while True:
headers['Range'] = f'bytes={downloaded}-{downloaded + chunk_size - 1}'
response = requests.get(url, headers=headers, stream=True)
if response.status_code == 206: # Partial Content
with open(save_path, 'ab') as f:
for chunk in response.iter_content(8192):
f.write(chunk)
downloaded += chunk_size
elif response.status_code == 416: # Range Not Satisfiable
break # 文件下载完成
else:
response.raise_for_status()
生产环境注意事项
连接池配置
from requests.adapters import HTTPAdapter
session = requests.Session()
adapter = HTTPAdapter(
pool_connections=20, # 连接池大小
pool_maxsize=100,
max_retries=3
)
session.mount('http://', adapter)
session.mount('https://', adapter)
代理设置最佳实践
- 使用环境变量管理敏感配置
- 支持代理自动切换
import os proxies = {'http': os.getenv('HTTP_PROXY'), 'https': os.getenv('HTTPS_PROXY') } response = requests.get(url, proxies=proxies)
常见问题排查指南
认证错误处理
- 检查 API 密钥是否过期
- 验证请求头格式:
headers = {'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json' }
文件校验方法
import hashlib
def verify_file(file_path, expected_md5):
with open(file_path, 'rb') as f:
file_hash = hashlib.md5(f.read()).hexdigest()
return file_hash == expected_md5
优化方向建议
- 异步下载 :使用 aiohttp 替代 requests
- CDN 加速 :配置云存储桶的 CDN 分发
- 队列处理 :对大批量下载使用任务队列
希望这些方案能解决你的文件下载问题。如果你有更好的实现方式,欢迎在评论区分享交流!
正文完
