2012-03-21 12 views
6

Aktualizuję istniejące obiekty w module Amazon S3, aby ustawić niektóre metadane. Chciałbym ustawić nagłówek HTTP Expires dla każdego obiektu, aby lepiej obsługiwać klientów HTTP/1.0.Ustaw nagłówek Expires dla istniejącego obiektu S3 przy użyciu pakietu AWS Java SDK

Używamy AWS Java SDK, która pozwala na zmiany metadanych obiektu bez ponownego przesyłania treści obiektu. Robimy to za pomocą CopyObjectRequest, aby skopiować obiekt do samego siebie. Klasa ObjectMetadata pozwala nam ustawić Cache-Control, Content-Type i kilka innych nagłówków. Ale nie nagłówek Expires.

Wiem, że S3 przechowuje i obsługuje nagłówek Expires dla obiektów PUT przy użyciu interfejsu API REST. Czy istnieje sposób, aby to zrobić z pakietu Java SDK?

Updated aby wskazać, że używamyCopyObjectRequest

Odpowiedz

6

Aby zmienić metadata istniejącego Amazon S3 obiektu, trzeba skopiować obiekt do siebie i zapewnić żądaną nową metadane na bieżąco, zobaczyć copyObject():

Domyślnie wszystkie metadane obiektu dla źródła obiekt zostanie skopiowany do nowego obiektu docelowego, o ile nie podano metadanych nowego obiektu w podanym obiekcie CopyObjectRequest określonego w specyfikacji .

Można to osiągnąć jak tak około (fragment z mojej głowie, więc uważaj):

AmazonS3 s3 = new AmazonS3Client(); 

String bucketName = "bucketName "; 
String key = "key.txt"; 
ObjectMetadata newObjectMetadata = new ObjectMetadata(); 
// ... whatever you desire, e.g.: 
newObjectMetadata.setHeader("Expires", "Thu, 21 Mar 2042 08:16:32 GMT"); 

CopyObjectRequest copyObjectRequest = new CopyObjectRequest() 
       .WithSourceBucketName(bucketName) 
       .WithSourceKey(key) 
       .WithDestinationBucket(bucketName) 
       .WithDestinationKey(key) 
       .withNewObjectMetadata(newObjectMetadata); 

s3.copyObject(copyObjectRequest); 

Należy pamiętać o następujących łatwo przegapić, ale ważne copyObject() ograniczenie:

Lista kontroli dostępu S3 do Amazon (ACL) to nie skopiowana do nowego obiektu . Nowy obiekt będzie miał domyślną licencję ACL na Amazon S3, CannedAccessControlList.Private, chyba że jedno jest jawnie podane w podanego obiektu CopyObjectRequest.

To jest nie rozliczane w moim fragmencie kodu jeszcze!

Powodzenia!

+0

Powinienem był lepiej wyjaśnić, że używamy 'CopyObjectRequest', aby zrobić to teraz. Zaktualizowałem pytanie, aby to odzwierciedlić. – bkirkbri

+0

'ObjectMetadata.setHeader' jest oznaczony jako tylko do użytku wewnętrznego. Czy udało ci się to z powodzeniem? Nasz kod zostanie uruchomiony tylko raz, więc nie będziemy musieli się nim martwić, jeśli Amazon wprowadzi zmiany. Ale YMMV. – bkirkbri

+0

Hmm, nie byłem świadom tego ograniczenia, ale przypomnij sobie, że w pewnym momencie użyłem słowa "Wygasa"; Mogę jednak być w błędzie, o ile często korzystam z innych pakietów SDK do interakcji z S3 (np. C#/Python, które zdecydowanie to wspierają) i mogłem to wymieszać - sam kod nie różni się od innego 'setXYZHeader()' metody obecnie (patrz [ObjectMetadata.java] (https://github.com/amazonwebservices/aws-sdk-for-java/blob/master/src/main/java/com/amazonaws/services/s3/model/ObjectMetadata. java # L141)), więc ograniczenie byłoby oparte na niewidocznym efekcie ubocznym, jeśli takie wystąpią. –

1

Szukaliśmy podobnego rozwiązania i ostatecznie rozstrzygane przez dyrektywy Cache-Control max-age. W końcu uświadomiliśmy sobie, że hte cache-control zastępuje Expires, nawet jeśli wygasa, jest bardziej restrykcyjne. I tak czy inaczej kontrola pamięci podręcznej również spełnia nasze wymagania.

+1

Dzięki. Jesteś absolutnie poprawny 'Cache-Control' zastępuje nagłówek' Expires'. Mimo to chcielibyśmy uwzględnić go dla klientów HTTP/1.0, którzy nie respektują "Cache-Control". – bkirkbri

Powiązane problemy