Задать заголовок Expires для существующего объекта S3 с помощью AWS Java SDK - PullRequest
6 голосов
/ 21 марта 2012

Я обновляю существующие объекты в корзине Amazon S3, чтобы установить некоторые метаданные. Я хотел бы установить заголовок HTTP Expires для каждого объекта, чтобы лучше обрабатывать клиентов HTTP / 1.0.

Мы используем AWS Java SDK , который позволяет вносить изменения метаданных в объект без повторной загрузки содержимого объекта. Мы делаем это, используя CopyObjectRequest , чтобы скопировать объект в себя. Класс ObjectMetadata позволяет нам устанавливать Cache-Control, Content-Type и несколько других заголовков. Но не заголовок Expires.

Я знаю, что S3 хранит и обслуживает заголовок Expires для объектов PUT с использованием REST API. Есть ли способ сделать это из Java SDK?

Обновлено, чтобы указать, что мы используем CopyObjectRequest

Ответы [ 2 ]

6 голосов
/ 21 марта 2012

Чтобы изменить метаданные существующего Amazon S3 объекта, вам необходимо скопировать объект в себя и предоставить нужные новые метаданные на лету, см. copyObject ( )

По умолчанию все метаданные объекта для исходного объекта копируются в новый целевой объект, если только метаданные нового объекта в задан CopyObjectRequest.

Это может быть достигнуто примерно так (фрагмент от макушки, так что будьте осторожны):

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);

Обратите внимание на следующие несложные, но важные copyObject () ограничение:

Список контроля доступа (ACL) Amazon S3 не скопирован в новый объект. Новый объект будет иметь по умолчанию Amazon S3 ACL, CannedAccessControlList.Private, если он явно не указан в указанный CopyObjectRequest.

Это , а не учтено в моем фрагменте кода!

Удачи!

1 голос
/ 21 марта 2012

Мы искали подобное решение и в конечном итоге остановились на директиве max-age для управления кэшем.И в конце концов мы поняли, что контроль кэша переопределяет Expires, даже если expires более ограничен.И в любом случае контроль кэша также отвечал нашим требованиям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...