2014-02-20 4 views
1

Я использую пакет Amazon .NET SDK в приложении, которое должно быть в состоянии загрузить пакет файлов из S3. Некоторые из этих файлов могут быть заархивированы для Glacier, и в этом случае приложение должно инициировать RestoreObjectRequests для любых таких файлов и не загружать файлы с S3. Вот некоторые решения, которые не работают:Получить статус файла Glacier в AWS .NET SDK

  • S3Object из ListObjectsResponse имеет свойство, которое Класс складирования S3StorageClass.Glacier для Glacier-совместимых файлов. Тем не менее, S3Object продолжает эту настройку, даже когда файл временно восстановлен, поэтому это не помогает.

  • Я надеялся, что RestoreObjectResponse вернет другой результат, если этот файл был либо в середине восстановления, либо был временно восстановлен, но он продолжает возвращать 0/OK.

  • Единственный способ определить, доступен ли файл в настоящее время, - это попытаться выполнить GetObjectRequest и посмотреть, не сработает ли он. Я не хочу использовать это решение, поскольку он может включать загрузку большого количества файлов только для того, чтобы найти, что один из них находится в Glacier.

Может ли кто-нибудь предложить другой вариант, который позволил бы мне узнать, доступны ли все изображения без необходимости их загрузки? Благодаря!

ответ

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 

Я до сих пор думаю, что было бы лучше для них, чтобы обеспечить что-то в объект ответа, который позволит вам узнать статус а не бросать исключение, но этот метод, по крайней мере, будет работать для того, что мне нужно.