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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:16:01