Google Storage存储桶目录下文件下载抛出GoogleApiException问题求助
GCS子目录文件下载报错修复方案
核心问题1:对象名前导斜杠错误
GCS的对象名不存在「根目录斜杠」的概念,你配置的/earnings/earnings_202107_212121-10.zip会被GCS判定为对象名本身包含开头的斜杠,和实际存储的无前置斜杠的对象名earnings/earnings_202107_212121-10.zip完全不匹配,因此触发资源找不到的API异常:
Exception thrown: 'Google.GoogleApiException' in mscorlib.dll
存储桶实际结构如下:
修复方式
直接去掉对象名开头的/即可:
// 根目录对象写法(无需修改) var bucket_name = "digital-jorgesys-454.appspot.com"; var object_name = "earnings_202107_212121-10.zip"; // 子目录对象正确写法 var bucket_name = "digital-jorgesys-454.appspot.com"; var object_name = "earnings/earnings_202107_212121-10.zip";
其他隐含问题修复
1. 本地子目录自动创建
当前代码直接使用GCS路径拼接本地存储路径,如果本地不存在对应子目录,会触发IO报错。需要在创建本地文件流前新增目录创建逻辑:
// 放在DownloadFile方法中创建FileStream的代码之前 var localFullPath = Path.Combine(LocalDownloadPath, filePathInGcs); var localParentDir = Path.GetDirectoryName(localFullPath); // 目录不存在则自动创建 if (!Directory.Exists(localParentDir)) { Directory.CreateDirectory(localParentDir); } var downloadStream = new FileStream(localFullPath, FileMode.Create, FileAccess.Write);
2. 异步异常捕获修复
当前调用DownloadFile时未加await关键字,异步方法抛出的异常无法被外层catch捕获,不利于问题排查,修改调用逻辑:
try { // 加await等待异步执行完成,异常可以被正常捕获 await DownloadFile(GCSServiceAccountEmail, P12KeyFullPath, P12KeySecret, bucket_name, object_name); } catch (AggregateException ex) { foreach (var e in ex.InnerExceptions) { Console.WriteLine("DownloadFile ERROR: " + e.Message); } }
内容的提问来源于stack exchange,提问作者Jorgesys
相关产品推荐
相关产品推荐

