如何解决Python调用Google Drive API导出链接下载文件损坏问题
问题分析与解决方案
可能的原因
- 未处理API错误响应
147字节的损坏文件基本是Google Drive API返回的JSON错误信息(比如权限不足、导出格式不支持、服务器临时过载),你直接把response.content写入文件,没做请求成功校验。不同时段不同文件出问题,大概率是API临时限流、导出服务负载波动导致部分请求随机失败。 - 网络请求中断
即使整体网络正常,单个请求可能因TCP连接断开、数据包丢失,只接收到截断的响应内容(刚好147字节的错误头)。不同时段网络链路稳定性变化,会影响不同文件的下载结果。 - 导出服务临时故障
Google Drive对复杂格式文件的导出(比如带复杂排版的Google Docs转docx),在服务器负载高时容易出现临时处理失败,这种故障是随机的,会导致不同时段失败的文件不同。
解决办法
强制校验HTTP响应状态
写入文件前先检查response.status_code是否为200,非成功状态时打印错误信息排查问题:response = requests.get(export_url, headers=headers) if response.status_code != 200: print(f"下载失败:状态码{response.status_code},错误内容:{response.text}") continue # 跳过或重试 with open(file_path, 'wb') as f: f.write(response.content)添加重试机制
针对临时网络波动或API限流,用重试逻辑覆盖随机失败场景,同时用流式下载减少中断影响:import requests from tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10)) def download_file(export_url, headers, file_path): response = requests.get(export_url, headers=headers, stream=True) response.raise_for_status() # 主动抛出HTTP错误 with open(file_path, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) return True验证文件完整性
下载后对比API返回的文件大小(通过Files.get接口获取size字段),不匹配则触发重试:import os # 先获取文件元信息 file_info = drive_service.files().get(fileId=file_id).execute() expected_size = int(file_info.get('size', 0)) # 下载后校验 actual_size = os.path.getsize(file_path) if expected_size != 0 and actual_size != expected_size: print(f"文件损坏,预期{expected_size}字节,实际{actual_size}字节,重试") # 执行重试逻辑确认权限与导出格式
确保API令牌拥有https://www.googleapis.com/auth/drive.readonly及以上权限,同时确认目标文件支持你指定的导出格式(比如Google Docs支持docx,但部分特殊文件可能不兼容)。请求失败时解析错误JSON,能快速定位权限或格式问题。
内容的提问来源于stack exchange,提问作者Kartik Jhawar
相关产品推荐
相关产品推荐

