簡體   English   中英

在AWS .NET SDK中獲取Glacier文件狀態

[英]Get Glacier file status in AWS .NET SDK

我在需要能夠從S3下載一批文件的應用程序中使用Amazon .NET SDK。 這些文件中的一些可能已存檔到Glacier,在這種情況下,應用程序應為任何此類文件啟動RestoreObjectRequests,而不是從S3下載任何文件。 以下是一些無效的解決方案:

  • ListObjectsResponse中的S3Object具有一個StorageClass屬性,該屬性是S3StorageClass.Glacier(用於啟用Glacier的文件)。 但是,即使臨時還原了文件,S3Object仍然具有該設置,因此無濟於事。

  • 我曾希望,如果有問題的文件處於還原過程中或被暫時還原,則RestoreObjectResponse將返回一些不同的結果,但是它繼續返回0 / OK。

  • 確定文件當前是否可用的唯一方法是嘗試嘗試GetObjectRequest並查看其是否失敗。 我不想使用該解決方案,因為它可能涉及下載大量文件,只是發現其中一個文件位於Glacier中。

誰能建議另一個選擇,使我無需下載所有圖像就可以知道它們是否可用? 謝謝!

好的,我有解決方案。 除了從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對象中提供一些信息,而不是拋出異常,讓您知道狀態,但是此方法至少可以滿足我的需要。

您可以執行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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM