Как обновить метаданные с помощью Amazon S3 SDK

Я использую PHP-версию AWS SDK от Amazon. У меня есть куча файлов с заголовком Expires ; Я хочу удалить этот заголовок и вместо этого добавить заголовок Cache-control . Функция update_object позволяет добавлять заголовки, но не удалять их.

Ответы на этот вопрос предполагают, что вы можете обновить метаданные файла при его копировании, но я попробовал его, и он не работает. Вот что я использовал:

 $response = $s3->copy_object( array( 'bucket' => $bucket, 'filename' => $file, ), array( 'bucket' => $bucket, 'filename' => $file2, ), array( 'acl' => AmazonS3::ACL_PUBLIC, 'headers' => array( 'Content-Type' => 'image/jpeg', 'Cache-Control' => 'public,max-age=30240000', ), 'meta' => array( 'x-fake-header' => 'something awesome is happening', ), ) ); 

Однако скопированный объект имеет те же заголовки, что и исходный объект (Expires и Content-Type). Я пробовал всевозможные сочетания вышеперечисленных (с и без Content-Type, Cache-control, meta и т. Д.) И получить тот же результат.

Как сбросить метаданные?

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

Но по какой-то странной причине копирование в другой файл не изменяет заголовки, но копирование в тот же файл делает.

В Java вы можете скопировать объект в одно и то же место. Здесь метаданные не будут копироваться при копировании объекта. Вы должны получить метаданные оригинала и установить для копирования запрос. Этот метод более рекомендуется вставлять или обновлять метаданные объекта Amazon S3

 ObjectMetadata metadata = amazonS3Client.getObjectMetadata(bucketName, fileKey); ObjectMetadata metadataCopy = new ObjectMetadata(); metadataCopy.addUserMetadata("yourKey", "updateValue"); metadataCopy.addUserMetadata("otherKey", "newValue"); metadataCopy.addUserMetadata("existingKey", metadata.getUserMetaDataOf("existingValue")); CopyObjectRequest request = new CopyObjectRequest(bucketName, fileKey, bucketName, fileKey) .withSourceBucketName(bucketName) .withSourceKey(fileKey) .withNewObjectMetadata(metadataCopy); amazonS3Client.copyObject(request);