使用服务账号上传Google Drive始终返回403(存储配额超限)
解决Google Drive服务账号配额用尽但已删除文件的问题
这里的核心问题是服务账号的Drive存储配额完全独立于你的G Suite个人账号——你看到的Limit: 16106127360(约15GB)是服务账号自身的默认配额,和你个人账号的30GB配额不共享。删除文件后如果没处理回收站,那些文件依然会占用配额,这大概率就是你遇到的情况。
下面是一步步的排查和解决方法:
1. 清空服务账号的回收站
服务账号没有可视化的Drive界面,删除的文件会留在回收站里持续占用存储空间,而且不会自动清空。你需要通过API永久删除这些文件:
// 初始化服务账号凭证和Drive服务 var cred = new ServiceAccountCredential( new ServiceAccountCredential.Initializer(clientEmail) { Scopes = new[] { DriveService.Scope.Drive } }.FromPrivateKey(privateKey)); var service = new DriveService(new BaseClientService.Initializer { HttpClientInitializer = cred, ApplicationName = "你的应用名称" }); // 查询所有已被放入回收站的文件 var trashRequest = service.Files.List(); trashRequest.Q = "trashed = true"; trashRequest.Fields = "files(id, name)"; var trashFiles = trashRequest.Execute(); // 逐个永久删除回收站文件 foreach (var file in trashFiles.Files) { service.Files.Delete(file.Id).Execute(); Console.WriteLine($"已永久删除回收站文件: {file.Name} (ID: {file.Id})"); }
2. 确认服务账号没有残留的可见文件
有时候可能漏删了一些未被标记为已删除的文件,再检查一遍:
var activeFilesRequest = service.Files.List(); activeFilesRequest.Q = "trashed = false"; activeFilesRequest.Fields = "files(id, name, size)"; var activeFiles = activeFilesRequest.Execute(); if (activeFiles.Files.Count > 0) { Console.WriteLine("发现未删除的可见文件:"); foreach (var file in activeFiles.Files) { Console.WriteLine($"{file.Name} (大小: {file.Size} 字节)"); // 如果需要,取消注释下面的代码删除这些文件 // service.Files.Delete(file.Id).Execute(); } } else { Console.WriteLine("服务账号下没有可见文件。"); }
3. 重新检查配额状态
执行完上面的操作后,再次调用API获取最新的配额信息:
var aboutRequest = service.About.Get(); aboutRequest.Fields = "*"; var about = aboutRequest.Execute(); Console.WriteLine($"服务账号配额上限: {about.StorageQuota.Limit} 字节"); Console.WriteLine($"当前已使用配额: {about.StorageQuota.Usage} 字节");
额外提示
- 服务账号的配额和个人账号完全隔离,所以你个人账号的配额显示正常不代表服务账号的配额也正常。
- 如果执行完所有操作后配额还是没有更新,可能需要等待Google后台的统计系统刷新(一般几小时内会更新,最多不超过24小时);如果还是不行,可以联系Google Workspace支持(因为你的服务账号关联了G Suite账号)。
内容的提问来源于stack exchange,提问作者Francis Ducharme
相关产品推荐
相关产品推荐

