使用服务帐户上传 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 活动?

使用服务帐户的Google Drive API问题

Google Drive API Python 服务帐户示例

Google Drive - 服务帐户存储限制