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

使用Google Drive API可恢复式上传Put请求忽略file_metadata问题

解决Google Drive可恢复上传时Metadata被忽略的问题

问题根源

  • 可恢复式上传分两个核心步骤:初始请求获取上传地址和PUT请求上传媒体内容,你错误地把metadata放到了第二步的PUT请求里——PUT阶段仅负责传输文件内容,不会处理任何metadata参数。
  • 你手动设置的Content-Length和requests自动生成的multipart请求头冲突,且files里的MetaData字段并非Google Drive API认可的参数格式。

修正后的完整代码

import json
import os
import requests

# 第一步:发送POST请求获取可恢复上传的location URL
file_metadata = {"name": "test.txt", "parents": ["###myFolderId###"]}
headers = {
    'Authorization': 'Bearer ' + access_token,
    'Content-Type': 'application/json'
}
params = {"uploadType": "resumable"}

# 发送初始POST请求,携带metadata
post_response = requests.post(
    "https://www.googleapis.com/upload/drive/v3/files",
    data=json.dumps(file_metadata),
    params=params,
    headers=headers
)
# 获取返回的上传地址
location_url = post_response.headers.get('Location')
if not location_url:
    print("获取上传地址失败:", post_response.text)
    exit()

# 第二步:用PUT请求上传媒体内容
file_path = saver_path + "file_id.txt"
with open(file_path, "rb") as media_file:
    put_headers = {
        'Authorization': 'Bearer ' + access_token,
        'Content-Length': str(os.path.getsize(file_path))
    }
    put_response = requests.put(location_url, data=media_file, headers=put_headers)
    print("Put请求结果 ", put_response.text)

关键说明

  • 初始POST请求必须携带uploadType=resumable参数,同时将metadata以JSON格式放在请求体中,API会返回Location响应头,这就是后续上传用的专属地址。
  • PUT请求仅需传输媒体文件的二进制数据,无需再传metadata,也不需要用files参数构造multipart请求,直接把文件对象传给data参数即可。
  • 若文件体积较大,可在此基础上实现分块上传,上述示例适用于小文件的完整上传场景。

内容的提问来源于stack exchange,提问作者gey ser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:52:27