使用Python Requests上传至Google Drive:文件名与进度条异常问题求助
修复方案
问题出在两个核心点:Google Drive API v3的元数据字段名错误,以及文件字段未正确传递文件名参数。以下是修复后的完整代码:
import sys import json import requests from tqdm import tqdm import requests_toolbelt from requests.exceptions import JSONDecodeError class ProgressBar(tqdm): def update_to(self, n: int) -> None: self.update(n - self.n) def upload_file(access_token: str, filename: str, filedirectory: str): # Drive API v3 使用name而非title作为文件名字段 metadata = { "name": filename, } session = requests.session() with open(filedirectory, "rb") as fp: # 文件字段需明确传递(文件名, 文件对象, MIME类型) files = { "file": (filename, fp, "text/plain"), # 根据实际文件类型调整MIME "data": ('metadata', json.dumps(metadata), 'application/json') } encoder = requests_toolbelt.MultipartEncoder(files) with ProgressBar( total=encoder.len, unit="B", unit_scale=True, unit_divisor=1024, miniters=1, file=sys.stdout, ) as bar: monitor = requests_toolbelt.MultipartEncoderMonitor( encoder, lambda monitor: bar.update_to(monitor.bytes_read) ) r = session.post( "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart", data=monitor, allow_redirects=False, headers={ "Authorization": "Bearer " + access_token, # 必须添加由MultipartEncoder生成的Content-Type头 "Content-Type": encoder.content_type }, ) try: resp = r.json() print("上传成功,文件信息:", resp) except JSONDecodeError: sys.exit(f"请求失败:{r.text}") # 替换为实际的access_token、目标文件名和本地文件路径 upload_file("your_actual_access_token", "test.txt", "./test.txt")
关键修复说明
- API字段修正:Google Drive API v3使用
name字段指定文件名,旧版的title字段已不再生效,原代码的title无法被API识别。 - 文件参数传递:构建MultipartEncoder的文件字段时,必须以
(文件名, 文件对象, MIME类型)的元组形式传入,否则Google Drive无法获取正确的文件名。如果不确定MIME类型,可使用mimetypes.guess_type(filedirectory)[0]自动识别。 - 请求头补充:必须将
encoder.content_type加入请求头,确保服务端能正确解析多部分表单数据,原代码缺失此头可能导致解析失败。
内容的提问来源于stack exchange,提问作者jak bin
相关产品推荐
相关产品推荐

