在AWS .NET SDK中获取Glacier文件状态

时间:2014-02-20 16:34:52

标签: .net amazon-web-services sdk amazon-s3 amazon-glacier

我在需要能够从S3下载一批文件的应用程序中使用Amazon .NET SDK。其中一些文件可能已归档到Glacier,在这种情况下,应用程序应为任何此类文件启动RestoreObjectRequests,而不从S3下载任何文件。以下是一些不起作用的解决方案:

  • ListObjectsResponse中的S3Object具有StorageClass属性,该属性为启用Glacier的文件的S3StorageClass.Glacier。但是,即使文件暂时还原,S3Object仍继续具有该设置,因此无效。

  • 我曾希望如果有问题的文件处于还原过程中或暂时还原,RestoreObjectResponse会返回一些不同的结果,但它会继续返回0 / OK。

  • 我可以找到确定文件当前是否可用的唯一方法是尝试GetObjectRequest并查看它是否失败。我不想使用该解决方案,因为它可能涉及下载大量文件,但却发现其中一个文件位于Glacier中。

任何人都可以建议另一个选项,让我知道所有图像是否可用而无需下载?谢谢!

2 个答案:

答案 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个相关属性:

  1. RestoreInProgress-如果为false,则还原完成/失败。
  2. 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;