Google Drive API Python:上传文件后无法获取目标文件夹
问题排查与修复方案
核心问题分析
- 遍历逻辑错误:
get_files_and_creds的循环中,只要第一个条目匹配不到目标文件夹就直接return False,不会继续检查后续项,导致漏掉实际存在的目标文件夹。 - 分页未处理:
pageSize=10限制仅返回前10条结果,上传文件后目标文件夹排序靠后(按修改时间排序),超出10条就无法获取。 - 未过滤文件夹类型:搜索时未指定仅查找文件夹,可能误匹配同名文件;且未明确排除垃圾文件,上传后文件夹状态变化可能影响搜索结果。
- 变量未初始化:
folder_id仅在匹配到文件夹时赋值,若遍历完未找到会导致后续报错。
修复后的代码
def get_files_and_creds(folder_name): try: creds = main() service = build("drive", "v3", credentials=creds) folder_id = None page_token = None # 循环处理所有分页结果 while True: results = ( service.files() .list( pageSize=100, pageToken=page_token, fields="nextPageToken, files(id, name, mimeType)", # 精准过滤:仅文件夹、匹配名称、非垃圾状态 q=f"mimeType='application/vnd.google-apps.folder' and name='{folder_name}' and trashed=false" ) .execute() ) items = results.get("files", []) for item in items: if item['name'] == folder_name: logging.debug(f"找到目标文件夹: {item['name']} -> {item['id']}") folder_id = item['id'] break page_token = results.get('nextPageToken', None) if not page_token or folder_id: break if not folder_id: logging.error(f"未找到名称为 {folder_name} 的文件夹") return False, None return folder_id, creds except HttpError as e: logging.error(f"获取文件列表出错: {str(e)}") return False, None def file_upload(upload_file, folder_name): try: logging.debug(f"目标文件夹: {folder_name},待上传文件: {upload_file}") folder_id, creds = get_files_and_creds(folder_name) if not folder_id or not creds: logging.error("获取文件夹ID或凭据失败") return logging.debug(f"文件夹ID: {folder_id}") service = build("drive", "v3", credentials=creds) # 自动识别文件MIME类型,替代硬编码的*/* mime_type, _ = mimetypes.guess_type(upload_file) mime_type = mime_type if mime_type else '*/*' file_metadata = { 'name': os.path.basename(upload_file), 'mimeType': mime_type, 'parents': [folder_id] } media = MediaFileUpload( upload_file, mimetype=mime_type, resumable=True ) file = service.files().create( body=file_metadata, media_body=media, fields='id' ).execute() logging.debug(f"文件上传成功,文件ID: {file.get('id')}") except Exception as e: logging.error(f"文件上传出错: {str(e)}")
关键修复点说明
- 精准搜索过滤:通过
q参数限定仅搜索文件夹、匹配目标名称且非垃圾状态,避免无效结果干扰。 - 修复遍历逻辑:移除循环内不匹配就返回的错误逻辑,遍历所有结果直到找到目标;初始化
folder_id避免未找到时的变量未定义问题。 - 处理分页:通过
page_token循环获取所有分页内容,确保不会漏掉超出单页数量的项目。 - 优化MIME类型:用
mimetypes模块自动识别文件类型,提升上传兼容性。 - 增强错误校验:在
file_upload中先检查folder_id和creds有效性,提前终止错误流程。
内容的提问来源于stack exchange,提问作者shopegg
相关产品推荐
相关产品推荐

