新闻中心

Google Drive API 服务账户文件上传指南:解决文件不显示问题

2025-10-31
浏览次数:
返回列表

Google Drive API 服务账户文件上传指南:解决文件不显示问题

本文旨在解决使用 google drive api 通过服务账户上传文件时,文件未显示在预期个人云盘中的常见问题。核心在于理解服务账户拥有独立的 drive 空间,而非直接访问个人云盘。解决方案涉及将个人云盘中的目标文件夹共享给服务账户,并正确配置 parents 字段,从而实现文件精准上传至指定位置。

在使用 Google Drive API 进行文件操作,尤其是通过服务账户进行上传时,开发者常会遇到一个困惑:代码执行成功,但文件却未出现在预期的个人 Google Drive 文件夹中。这通常并非代码逻辑错误,而是对 Google Drive 服务账户工作原理的误解所致。本教程将深入探讨这一问题,并提供清晰的解决方案。

理解 Google Drive 服务账户的工作原理

Google Drive API 中的服务账户(Service Account)是一种特殊的账户类型,它代表应用程序而非最终用户进行操作。每个服务账户都拥有一个独立的 Google Drive 空间,这个空间与您的个人 Google Drive 账户是完全隔离的。当您使用服务账户上传文件时,如果未指定目标文件夹,文件默认会被上传到该服务账户自己的 Drive 根目录中,而不是您的个人 Drive 根目录。

这就是为什么即使上传操作看似成功,您也无法在个人 Drive 中找到文件——它们实际上存在于服务账户的 Drive 空间中。

解决方案:共享文件夹与正确配置 parents 字段

要将文件上传到您的个人 Google Drive 中的特定文件夹,您需要执行以下两个关键步骤:

Musho Musho

AI网页设计Figma插件

Musho 76 查看详情 Musho
  1. 将目标文件夹共享给服务账户: 由于服务账户无法直接访问您的个人 Drive,您必须明确地将您希望上传文件的目标文件夹共享给服务账户。
  2. 在上传请求中指定 parents 字段: 在文件元数据中,使用 parents 字段指定目标文件夹的 ID。

步骤一:获取服务账户的电子邮件地址并共享文件夹

  1. 获取服务账户电子邮件地址:
    • 登录 Google Cloud Console。
    • 导航到 "IAM 与管理" -> "服务帐号"。
    • 找到您正在使用的服务账户,其下方会显示一个电子邮件地址(通常格式为 [服务账户名称]@[项目ID].iam.gserviceaccount.com)。复制此电子邮件地址。
  2. 共享 Google Drive 文件夹:
    • 在您的个人 Google Drive 中,找到您希望上传文件的目标文件夹。
    • 右键点击该文件夹,选择 "共享" 或 "获取链接"。
    • 在共享设置中,将之前复制的服务账户电子邮件地址添加为协作者,并赋予其 "编辑者" 权限(至少需要 "编辑者" 权限才能上传文件)。

步骤二:获取目标文件夹 ID

  1. 在您的个人 Google Drive 中,打开您已共享给服务账户的目标文件夹。
  2. 查看浏览器地址栏,URL 结构通常为 https://drive.google.com/drive/folders/[文件夹ID]。复制 [文件夹ID] 部分。

步骤三:修改代码以包含 parents 字段

获取了服务账户邮箱和目标文件夹 ID 后,您就可以修改 Python 代码了。关键在于在 file_metadata 中添加 parents 字段,并将其值设置为一个包含目标文件夹 ID 的列表。

以下是修正后的示例代码:

from __future__ import print_function
import os

from google.oauth2 import service_account
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload

# 配置认证信息
SCOPES = ['https://www.googleapis.com/auth/drive.file']
# 请替换为您的服务账户密钥文件路径
SERVICE_ACCOUNT_FILE = 'C:\Users\danie\OneDrive\Documentos\PAP\teste drive\iris-face-models-565de449aa27.json'

# 创建凭据对象
credentials = service_account.Credentials.from_service_account_file(
    SERVICE_ACCOUNT_FILE, scopes=SCOPES
)

# 构建 Drive API 服务
drive_service = build('drive', 'v3', credentials=credentials)

# 请替换为您的目标文件夹ID
# 这个文件夹必须已经共享给上述服务账户的邮箱地址
target_folder_id = '1MAM4CPDMbqpzP5rZb1Zw0A15r4U7B4Kv' 

# 定义文件元数据
file_metadata = {
    'name': 'test_file.txt',
    'parents': [target_folder_id] # 关键:指定目标文件夹ID
}

# 准备要上传的本地文件
# 请替换为您的本地文件路径
local_file_path = 'C:\Users\danie\OneDrive\Documentos\PAP\testeicheiro\Ficheiro_teste.txt'
media = MediaFileUpload(local_file_path, mimetype='text/plain')

# 执行文件上传
try:
    file = drive_service.files().create(
        body=file_metadata,
        media_body=media,
        fields='id,name,parents' # 请求返回文件ID、名称和父文件夹信息,以便验证
    ).execute()
    print(f"文件 '{file.get('name')}' (ID: {file.get('id')}) 已成功上传。")
    if file.get('parents'):
        print(f"上传至文件夹 ID: {file.get('parents')[0]}")
    else:
        print("文件上传至服务账户的根目录。")
except Exception as e:
    print(f"文件上传失败: {e}")

注意事项与最佳实践

  1. 权限(SCOPES): 确保您的 SCOPES 包含必要的权限。https://www.googleapis.com/auth/drive.file 允许应用程序创建和管理其通过 API 访问的文件。如果您需要更广泛的访问权限(例如,访问服务账户 Drive 中的所有文件),可能需要 https://www.googleapis.com/auth/drive,但这通常不推荐,除非绝对必要。
  2. 服务账户密钥文件安全: SERVICE_ACCOUNT_FILE 包含敏感信息,应妥善保管,切勿将其直接提交到公共代码仓库。在生产环境中,建议使用环境变量或密钥管理服务来存储和访问凭据。
  3. 错误处理: 在实际项目中,应添加更健壮的错误处理机制,例如 try-except 块来捕获 API 调用可能引发的异常。
  4. 文件 MIME 类型: MediaFileUpload 中的 mimetype 参数应与您上传的文件类型相匹配。例如,文本文件为 text/plain,JPEG 图片为 image/jpeg。
  5. 替代方案: 虽然 Google Drive API 是强大的文件存储解决方案,但如果您的项目对云存储有其他特定需求(例如,需要更简单的集成、更低的成本或特定的数据处理功能),也可以考虑其他云存储服务,如 Amazon S3 或 Azure Blob Storage。然而,对于与 Google 生态系统紧密集成的应用,Google Drive API 仍是首选。

总结

通过理解 Google Drive 服务账户的隔离性,并采取将目标文件夹共享给服务账户、以及在代码中正确配置 parents 字段的策略,您可以成功地将文件上传到个人 Google Drive 中的指定位置。这一解决方案不仅解决了文件“消失”的困境,也加深了对 Google Drive API 认证和权限机制的理解,为构建更健壮的云存储集成应用奠定了基础。

以上就是Google Drive API 服务账户文件上传指南:解决文件不显示问题的详细内容,更多请关注其它相关文章!


# js  # json  # go  # 浏览器  # ai  # python  # 上传文件  # 到您  # 传至  # 这一  # 上传  # 文件上传  # 您的  # 为什么  # 常见问题  # 云存储  # 邮箱  # google  # 环境变量  # red  # 西青区全域营销推广公司  # 芜湖快手网络推广再营销  # 枣强中学网站建设总结  # 房地产整合营销推广  # 网站编辑推广是啥  # 黄山seo网站排名优化报价  # 河南网站优化简历内容  # 睢宁抖音营销推广外包公司  # 东莞营销推广哪里靠谱  # seo项目管理系统  # 而非  # 重写  # 自定义 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】  Win11网速慢怎么解决 Win11网络设置优化解除限速  为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法  qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决  蛙漫安全无毒 官方认证的绿色入口  如何在CSS中使用浮动制作导航栏_float实现水平菜单  树莓派传感器触发:通过Twilio API发送WhatsApp消息教程  在Go Martini框架中高效服务动态生成图像的实践指南  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  TikTok网页版直接登录 TikTok网页端官方平台入口  电脑IP地址怎么查 查看本机IP地址的几种方法  Golang如何优雅处理error_Golang error处理最佳实践总结  微信语音通话掉线如何解决 微信语音通话稳定优化方法  J*a递归快速排序中静态变量导致数据累积问题的解决方案  Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略  Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧  如何在J*a中使用Locale处理多语言环境  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  Angular Material 垂直步进器:实现底部到顶部排序的教程  QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问  葱吃多了会怎样 葱吃多了会伤胃吗  Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】  利用Bokeh CustomJS动态控制DataTable列可见性  单射、满射与双射的关系 一文理清所有逻辑  J*aScript类型检查_j*ascript代码规范  CKEditor 5 自定义构建在React应用中渲染失败的调试与解决  使用J*aScript检测输入元素是否包含在特定类中  学习通在线学习平台 学习通网页版直接进入课程中心  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  痛风发作了怎么办? 快速止痛和后期饮食调理  解决J*aScript中重复选择项的确认对话框显示问题  TikTok评论显示延迟如何处理 TikTok评论刷新优化方法  Angular中单选按钮的正确使用与常见陷阱解析  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  探索高级语言到原生C/C++的转译:挑战与内存管理策略  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  解决Django多数据库/多Schema环境下外键迁移问题  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比  AO3镜像入口大全 AO3网页版内容访问全集  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  Golang指针如何与map组合使用_Golang map指针组合实践  在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析  微信客户端如何收红包_微信客户端接收红包使用教程  J*a最大堆Heapify方法修复:索引计算与边界条件深度解析  格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  《主播少女的秘密账号迷宫》首支宣传片  在python-socketio事件处理器中安全访问Flask应用上下文 

搜索