【问题标题】:Get Glacier file status in AWS .NET SDK在 AWS .NET SDK 中获取 Glacier 文件状态
【发布时间】:2014-02-20 16:34:51
【问题描述】:
我在需要能够从 S3 下载一批文件的应用程序中使用 Amazon .NET SDK。其中一些文件可能已存档到 Glacier,在这种情况下,应用程序应为任何此类文件启动 RestoreObjectRequests,而不是从 S3 下载任何文件。以下是一些不起作用的解决方案:
ListObjectsResponse 中的 S3Object 有一个 StorageClass 属性,即 S3StorageClass.Glacier 用于 Glacier 启用的文件。但是,即使文件被临时恢复,S3Object 仍会继续具有该设置,因此这无济于事。
-
我曾希望如果相关文件处于恢复过程中或临时恢复时,RestoreObjectResponse 会返回一些不同的结果,但它继续返回 0 / OK。
李>
我可以找到确定文件当前是否可用的唯一方法是尝试 GetObjectRequest 并查看它是否失败。我不想使用该解决方案,因为它可能涉及下载大量文件,然后才发现其中一个在 Glacier。
谁能建议另一个选项,让我知道是否所有图像都可用而无需下载它们?谢谢!
【问题讨论】:
标签:
.net
amazon-web-services
sdk
amazon-s3
amazon-glacier
【解决方案1】:
好的,我有一个解决方案。可以只提取第一个字节,而不是从 S3 中提取完整文件:
GetObjectRequest getObjectRequest = new GetObjectRequest();
getObjectRequest.BucketName = bucketName;
getObjectRequest.Key = key;
getObjectRequest.ByteRange = new ByteRange(0, 1);
try
{
s3Client.GetObject(getObjectRequest);
}
catch (AmazonS3Exception ex)
{
if (ex.ErrorCode == "InvalidObjectState")
{
// In Glacier, perform appropriate actions
}
else throw ex;
}
// If no exception, object has been restored
我仍然认为他们最好在 Response 对象中提供一些让您知道状态而不是抛出异常的东西,但这种方法至少可以满足我的需要。
【解决方案2】:
你可以做一个 GetObjectMetadata 并且响应类包含 2 个相关属性:
- RestoreInProgress - 如果为 false,则恢复完成/失败。
- RestoreExpiration - 获取已恢复文件的到期日期(如果已恢复)。
你可以试试这样的:
GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest
{
BucketName = bucketName,
Key = objectKey
};
GetObjectMetadataResponse response = await client.GetObjectMetadataAsync(metadataRequest);
if (!response.RestoreInProgress)
{
return (response.RestoreExpiration.HasValue && response.RestoreExpiration.Value<DateTime.UtcNow);
}
return false;