我试图从谷歌云存储(谷歌播放发布的应用程序的日志文件)下载一些文件。从谷歌云存储下载总是不正确的哈希
我的代码看起来像这样
Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", "my-service-account-credential.json", EnvironmentVariableTarget.Process);
StorageClient storageClient = StorageClient.Create();
var bucketName = "mybucketname";
var buckets = storageClient.GetBucket(bucketName);
var objects = storageClient.ListObjects(bucketName).ToList();
foreach (var o in objects)
{
try
{
Directory.CreateDirectory(Path.GetDirectoryName(o.Name));
using (var fs = File.Open(o.Name, FileMode.OpenOrCreate))
{
await storageClient.DownloadObjectAsync(bucketName, o.Name, fs);
}
}
catch (Exception e)
{
if (e.Message.StartsWith("Incorrect hash"))
{
continue;
}
throw;
}
}
的代码实际上似乎很好地工作(通过查看实际下载的文件的内容来看,它是CSV文件)。但正如你所看到的,我已经实现了一个令人讨厌的尝试catch/hack,因为我下载的每个文件都会抛出一个异常,指出hash不正确。我假设客户端库将下载内容的散列值与存储区的散列值进行比较,并且这些散列值并不相同,导致它是一个例外。
唯一的例外是:
System.IO.IOException: Incorrect hash: expected 'DXpVGw==' (base64), was '2RMrcw==' (base64)
at Google.Cloud.Storage.V1.StorageClientImpl.<DownloadObjectAsyncImpl>d__48.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at MyClass.GoogleBucket.Functions.<DownloadGoogleBucketLogs>d__1.MoveNext() in mycode.cs:line 51
所以我的问题是你如何下载对象,没有得到这个例外,显然一个是不应该做的我做了什么。
您能否包含完整的例外详情? – mjwills
我添加了异常详细信息,如果有帮助的话。请注意,我尝试了不同的时间,许多文件始终发生异常。 – sjkp
我不知道这是否与客户端库有关。您能否根据他们的GCS元数据告诉我对象的内容类型和内容编码? –