You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Python API上传Google Drive二进制文件缺失md5Checksum元数据及更新校验问题

解决Google Drive Python API上传后无法获取md5Checksum的问题

我之前也碰到过一模一样的情况——上传二进制文件后调用API拿元数据,死活找不到md5Checksum字段,后来排查发现主要是两个细节没处理好,下面给你一步步解决的办法:

1. 显式指定fields参数获取哈希值

Google Drive API的files.get接口默认只返回少量基础元数据(比如文件ID、名称),不会主动返回md5Checksum。你必须在请求里明确指定要获取的字段,才能拿到这个哈希值。

Python代码示例

from googleapiclient.discovery import build
from google.oauth2.credentials import Credentials

# 假设你已经通过token.json加载了有效的授权凭证
creds = Credentials.from_authorized_user_file('token.json')
service = build('drive', 'v3', credentials=creds)

file_id = 'whate...'  # 你的目标文件ID

# 显式声明要获取的字段,必须包含md5Checksum
response = service.files().get(
    fileId=file_id,
    fields='id,name,md5Checksum'
).execute()

# 输出结果
print(f"文件名: {response.get('name')}")
print(f"MD5校验值: {response.get('md5Checksum')}")

2. 处理上传后的哈希计算延迟

有时候刚上传完文件,Drive后端还没来得及完成md5的计算,这时候调用files.get会返回md5ChecksumNone。这种情况可以加个简单的重试机制,等几秒再请求:

带重试逻辑的代码示例

import time
from googleapiclient.errors import HttpError

max_retries = 5
retry_interval = 2  # 每次重试间隔2秒

for attempt in range(max_retries):
    try:
        response = service.files().get(
            fileId=file_id,
            fields='id,name,md5Checksum'
        ).execute()
        md5_value = response.get('md5Checksum')
        if md5_value:
            print(f"成功获取MD5: {md5_value}")
            break
        else:
            print(f"第{attempt+1}次重试,后端还没生成MD5...")
            time.sleep(retry_interval)
    except HttpError as e:
        print(f"请求出错: {e}")
        time.sleep(retry_interval)
else:
    print(f"重试{max_retries}次后仍未拿到MD5,请确认文件是二进制格式(不是Google Docs/Sheets这类云端原生文件)")

3. 确保上传时没有触发格式转换

如果你上传的是二进制文件(比如压缩包、自定义格式文件),要避免Drive自动把它转换成Google Docs格式——这类云端原生文件是没有md5Checksum元数据的。上传时要指定正确的MIME类型,比如用application/octet-stream

from googleapiclient.http import MediaFileUpload

file_path = '/path/to/your/local/file'
file_metadata = {'name': 'your_file_name'}

# 指定通用二进制MIME类型,避免格式转换
media = MediaFileUpload(
    file_path,
    mimetype='application/octet-stream',
    resumable=False
)

# 上传时直接请求返回md5Checksum
upload_result = service.files().create(
    body=file_metadata,
    media_body=media,
    fields='id,name,md5Checksum'
).execute()

print(f"上传完成,文件ID: {upload_result['id']},MD5: {upload_result.get('md5Checksum')}")

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

火山引擎 最新活动