【问题标题】:Google Drive upload with a service account always returns 403 (Storage Quota)使用服务帐户上传 Google Drive 总是返回 403(存储配额)
【发布时间】:2023-03-09 10:48:01
【问题描述】:

我编写了一些逻辑来将文件上传到共享给服务帐户 (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 帐号删除。

有什么想法吗?

【问题讨论】:

    标签: c# .net google-drive-api


    【解决方案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);
      }
      

      【讨论】:

        猜你喜欢
        • 2012-09-12
        • 2013-07-10
        • 2017-07-07
        • 1970-01-01
        • 2021-08-04
        • 2015-03-28
        • 2014-08-24
        • 2019-03-07
        • 1970-01-01
        相关资源
        最近更新 更多