使用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
相关产品推荐
相关产品推荐

