使用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字段指定。
步骤如下:
- 先获取(或创建)
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')
- 在上传文件的元数据里添加
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
相关产品推荐
相关产品推荐

