1

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

  • ListObjectsResponse 中的 S3Object 具有 StorageClass 属性,即 S3StorageClass.Glacier 用于 Glacier 启用的文件。但是,即使文件被临时恢复,S3Object 仍继续具有该设置,因此无济于事。

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

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

谁能建议另一个选项,让我知道是否所有图像都可用而无需下载它们?谢谢!

4

2 回答 2

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 对象中提供一些东西来让你知道状态而不是抛出异常,但是这种方法至少可以满足我的需要。

于 2014-02-21T02:48:08.700 回答
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;
于 2018-08-21T07:43:22.453 回答