我在需要能够从S3下载一批文件的应用程序中使用Amazon .NET SDK。其中一些文件可能已归档到Glacier,在这种情况下,应用程序应为任何此类文件启动RestoreObjectRequests,而不从S3下载任何文件。以下是一些不起作用的解决方案:
ListObjectsResponse中的S3Object具有StorageClass属性,该属性为启用Glacier的文件的S3StorageClass.Glacier。但是,即使文件暂时还原,S3Object仍继续具有该设置,因此无效。
我曾希望如果有问题的文件处于还原过程中或暂时还原,RestoreObjectResponse会返回一些不同的结果,但它会继续返回0 / OK。
我可以找到确定文件当前是否可用的唯一方法是尝试GetObjectRequest并查看它是否失败。我不想使用该解决方案,因为它可能涉及下载大量文件,但却发现其中一个文件位于Glacier中。
任何人都可以建议另一个选项,让我知道所有图像是否可用而无需下载?谢谢!
答案 0 :(得分:0)
好的,我有一个解决方案。而不是从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对象中提供一些东西,让你知道状态而不是抛出异常,但这种方法至少可以满足我的需要。
答案 1 :(得分:0)
您可以执行GetObjectMetadata,响应类包含2个相关属性:
您可以尝试以下操作:
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;