使用服务帐户上传 Google Drive 总是返回 403(存储配额)
Posted
技术标签:
【中文标题】使用服务帐户上传 Google Drive 总是返回 403(存储配额)【英文标题】:Google Drive upload with a service account always returns 403 (Storage Quota) 【发布时间】:2018-11-02 16:14:51 【问题描述】:我编写了一些逻辑来将文件上传到共享给服务帐户 (uploader@uploadproject-204816.iam.gserviceaccount.com) 的 Google Drive 文件夹中
Google 云端硬盘本身与我的 G Suite 帐户相关联。
这工作了一段时间,但最终我开始收到此错误:
Google.Apis.Requests.RequestError 用户的云端硬盘存储配额已 被超过。 [403]错误[消息[用户的驱动器存储配额 已超出。] 位置[-] 原因[storageQuotaExceeded] 域[全局] ]
从那以后,上传无法正常工作,即使上传小文件时也会出现此错误。
使用我的真实账户,我清理了服务账户拥有的所有文件,包括那些“杂乱无章”的文件。
左边的配额显示“170MB of 30GB used”
我也等了超过 24 小时。
我认为这是关于服务帐户本身,而不是驱动器。但我不确定要检查什么。
我尝试检查About.Get()
方法的结果,没有发现任何有用的东西。
var cred = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(clientEmail)
Scopes = (new[] "https://www.googleapis.com/auth/drive" ).ToList()
.FromPrivateKey(privateKey));
service = new DriveService(new Google.Apis.Services.BaseClientService.Initializer ApiKey = apiKey, HttpClientInitializer = cred );
var about = service.About.Get();
编辑:
原来我需要做些其他事情来获取有关配额的更多信息
var get = service.About.Get();
get.Fields = "*";
var about = get.Execute();
那我可以在about.StorageQuota
看到
Limit: 16106127360
Usage: 16106125128
确实,我现在了解存储配额错误。问题是,我如何重置这些数字?服务帐号上传的所有文件均已被同一位置的 MY 帐号删除。
有什么想法吗?
【问题讨论】:
【参考方案1】:事实证明,为了降低服务帐户的存储使用量,还需要使用服务帐户删除文件。
When does the files get deleted from Google Drive Service account?
【讨论】:
【参考方案2】:您不能使用您的真实账户删除由账户服务创建(如此拥有)的文件。
即使您这样做了,您也不会在真实帐户中看到文件,但它们仍在服务帐户中。
您必须使用帐户服务删除它们。
下面的脚本解释了用 php 删除文件。为此,您必须知道要删除的文件的 ID。因此我们请求获取 0B1-GGKdq5A3qX1dzNkhOLW1VWVU 引用的父文件夹中包含的所有文件 ID(每个文件和文件夹都由唯一的 UID 引用,就像这样),然后循环删除每个文件。
首先创建客户端以连接到服务帐户
$drive_service = new Google_Service_Drive($client);
其次,获取0B1-GGKdq5A3qX1dzNkhOLW1VWVU引用的文件夹中的所有文件
$files_list = $drive_service->files->listFiles(array(
'fields' => 'files(id, name)',
'q' => "'0B1-GGKdq5A3qX1dzNkhOLW1VWVU' in parents" ,
);) ;
$files_list = $files_list->getFiles() ;
然后循环删除所有文件
foreach ($files_list as $file)
$id = $file->id;
$resp = $drive_service->files->delete($id);
【讨论】:
以上是关于使用服务帐户上传 Google Drive 总是返回 403(存储配额)的主要内容,如果未能解决你的问题,请参考以下文章
Google Drive API - 服务帐户存储限制 - 替代方案
使用 Flutter 将图像上传到通用 Google Drive 帐户
如何使用 Google 服务帐户通过 Activity API 检索 Google Drive 活动?