如何用Python的GDrive API从URL直传文件至谷歌云盘(无需本地存储)
问题解决:PyDrive上传内存中图片数据报错TypeError
错误原因
SetContentFile()方法的设计是接收本地文件路径字符串,而非BytesIO对象,直接传入BytesIO会触发类型不匹配错误。
解决方案
使用PyDrive提供的SetContentBytes()方法直接上传字节数据,无需借助本地文件或额外的BytesIO中转(若需对数据流做预处理,也可基于BytesIO读取字节后传入)。同时清理原代码中冗余的请求与重复导入。
修正后的完整代码
import requests import os from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive from dotenv import load_dotenv # 加载环境变量 load_dotenv() # 认证并创建PyDrive客户端 gauth = GoogleAuth() drive = GoogleDrive(gauth) # 目标云端硬盘文件夹ID folder_id = "1GUUQO5huBXFQfsx_on7DdDDmkHnrZIsd" # 待抓取的图片URL url = "替换为你的图片URL" # 请求头(携带API授权信息) headers = {"Authorization": os.getenv("API")} # 获取图片字节数据 response = requests.get(url, headers=headers) if response.status_code == 200: filename = 'hello2.jpg' # 创建云端文件对象 file = drive.CreateFile({ 'title': filename, 'parents': [{'id': folder_id}] }) # 直接传入图片字节数据完成上传 file.SetContentBytes(response.content) file.Upload() print(f'图片 {filename} 已成功上传至Google Drive。') else: print(f"获取图片失败,状态码:{response.status_code}")
补充说明
如果需要对数据流做额外处理(如修改图片内容),可借助BytesIO读取字节后传入:
from io import BytesIO with BytesIO(response.content) as fp: # 这里可添加数据流处理逻辑 fp.seek(0) file.SetContentBytes(fp.read())
内容的提问来源于stack exchange,提问作者Dummy Cron
相关产品推荐
相关产品推荐

