You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:40:27