代码之家  ›  专栏  ›  技术社区  ›  Francis Ducharme

使用服务帐户的Google Drive Upload始终返回403(存储配额)

  •  0
  • Francis Ducharme  · 技术社区  · 6 年前

    我写了一些逻辑来将文件上传到一个共享到服务帐户的谷歌驱动器文件夹中(uploader@uploadproject-204816.iam.gsserviceaccount.com)

    谷歌驱动器本身与我的G套件帐户相关联。

    这工作了一段时间,但最终我开始得到这个错误:

    google.apis.requests.requestError用户的驱动器存储配额 已超过。[403]错误[message[用户的驱动器存储配额 已超过。]位置[-]原因[StorageQuotaExceeded] 域[全局]]

    从那以后,上传就不起作用了,即使上传一个微不足道的文件也会出现这个错误。

    使用我的真实帐户,我清理了服务帐户所有的文件,甚至那些“无组织”的文件。

    左边的配额表示“使用了170MB的30GB”

    我也等了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
    

    因此,我现在确实理解了存储配额错误。问题是,如何重置这些数字?我的帐户在同一位置删除了服务帐户上载的所有文件。

    有什么想法吗?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Francis Ducharme    6 年前

    结果发现,为了降低服务帐户的存储使用率,还需要使用服务帐户删除文件。

    When does the files get deleted from Google Drive Service account?

        2
  •  0
  •   T. Mehdi    5 年前

    您不能删除由帐户服务用您的真实帐户创建(拥有)的文件。

    即使您这样做了,您也不会看到真实帐户上的文件,但它们仍然在服务帐户上。

    您必须使用帐户服务删除它们。

    下面是一个用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);
    }