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

使用Python Requests库向Google Drive上传文件遇问题求助

排查Google Drive API上传文件的问题

咱们先拆解你遇到的两个核心问题:生成无标题空文档、文件没存到指定目录,大概率是元数据设置和文件内容传递这两部分出了问题,我给你梳理下常见坑和修正思路:

一、无标题空文档的原因&解决办法

1. 元数据缺失关键字段

你可能没在请求的元数据里指定name字段,Google Drive会默认生成无标题文件;另外如果上传的是二进制文件,mimeType设置错误的话,会被错误识别成Google文档(比如传PDF却没设对应MIME类型,就会生成空的Google文档)。

正确的元数据示例:

file_metadata = {
    'name': '你的目标文件名.pdf',  # 必须明确指定文件名
    'mimeType': 'application/pdf'  # 匹配本地文件的MIME类型
}

2. 文件内容传递错误

如果调用files.create()时,media_body参数没正确指向本地文件,或者用错了媒体上传类,就会导致上传空文件。比如直接传字符串而不是用MediaFileUpload封装,就会出问题。

标准的文件上传代码片段:

from googleapiclient.http import MediaFileUpload

# 假设你已经完成了Drive服务的授权初始化
drive_service = build('drive', 'v3', credentials=creds)

file_metadata = {
    'name': 'test.pdf',
    'mimeType': 'application/pdf'
}
# 用MediaFileUpload封装本地文件路径
media = MediaFileUpload('/本地文件路径/test.pdf', mimetype='application/pdf')
# 执行上传并获取文件ID
file = drive_service.files().create(body=file_metadata, media_body=media, fields='id').execute()
print(f"上传成功,文件ID: {file.get('id')}")

二、文件没存到root/level_1目录的原因&解决办法

1. 不能直接用路径,需指定父文件夹ID

Drive API不支持直接用root/level_1这种路径,得先获取level_1文件夹的ID,再在元数据里通过parents字段指定。

步骤如下:

  1. 先获取(或创建)level_1文件夹的ID:
def get_or_create_folder(folder_name):
    # 搜索根目录下的目标文件夹
    response = drive_service.files().list(
        q=f"name='{folder_name}' and mimeType='application/vnd.google-apps.folder' and trashed=false",
        spaces='drive',
        fields='files(id, name)'
    ).execute()
    items = response.get('files', [])
    if items:
        return items[0]['id']
    else:
        # 如果文件夹不存在,就创建它
        folder_metadata = {
            'name': folder_name,
            'mimeType': 'application/vnd.google-apps.folder'
        }
        folder = drive_service.files().create(body=folder_metadata, fields='id').execute()
        return folder['id']

# 获取level_1文件夹的ID
level1_folder_id = get_or_create_folder('level_1')
  1. 在上传文件的元数据里添加parents字段:
file_metadata = {
    'name': 'test.pdf',
    'mimeType': 'application/pdf',
    'parents': [level1_folder_id]  # 指定父文件夹ID
}

2. 检查权限问题

如果你的授权账号没有level_1文件夹的写入权限,文件会默认存到根目录,这时候要先确保账号能访问并编辑目标文件夹。

三、额外的常见坑提醒

  • 上传大文件时,要启用分块上传避免超时:
media = MediaFileUpload('/大文件路径', chunksize=1024*1024, resumable=True)
request = drive_service.files().create(body=file_metadata, media_body=media)
response = None
while response is None:
    status, response = request.next_chunk()
    if status:
        print(f"上传进度: {int(status.progress() * 100)}%")
print(f"上传完成,文件ID: {response.get('id')}")
  • 区分普通文件和Google文档:如果想把本地docx转成Google文档,要把mimeType设为application/vnd.google-apps.document,同时确保MediaFileUpload启用分块上传。

你可以对照这些点检查你的代码,应该能解决问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:13:49