![](/img/trans.png)
[英]How can I upload a large zip file to Amazon Glacier with .NET, using Amazon.Glacier.Transfer.ArchiveTransferManager.Upload?
[英]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個相關屬性:
您可以嘗試這樣的事情:
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.