web-dev-qa-db-fra.com

Comment mettre à jour les métadonnées d'un fichier Amazon S3 existant?

J'ai besoin de mettre à jour l'en-tête de contrôle du cache dans tous les fichiers cloud d'AmazonS3. Cependant, je ne peux pas comprendre comment je fais cela en utilisant l'API jclouds. J'utilise le plugin Apache jclouds. Et j'ai obtenu deux réponses liées:

La première réponse suggère d'utiliser la classe SwiftKey Api qui n'est pas disponible dans le plugin jcloud de grails. La deuxième réponse utilise AWS Java sdk pour lequel il existe déjà un plugin d'enveloppement Grails https://grails.org/plugin/aws-sdk mais il ne fonctionne pas) t prend en charge la mise à jour des métadonnées.

24
Priyanshu Chauhan

Il est possible de modifier les métadonnées en effectuant une copie d'objet (voir Comment mettre à jour les métadonnées à l'aide d'Amazon S3 SDK ):

ObjectMetadata metadataCopy = new ObjectMetadata();
// copy previous metadata
metadataCopy.addUserMetadata("newmetadata", "newmetadatavalue");

CopyObjectRequest request = new CopyObjectRequest(bucketName, existingKey, bucketName, existingKey)
      .withNewObjectMetadata(metadataCopy);

amazonS3Client.copyObject(request);

Que ce soit philosophiquement une "mise à jour", c'est à vous de décider.

31
Dan Gravell

Vous ne pouvez pas:

Chaque objet Amazon S3 possède des données, une clé et des métadonnées. La clé d'objet (ou le nom de clé) identifie de manière unique l'objet dans un compartiment. Les métadonnées d'objet sont un ensemble de paires nom-valeur. Vous pouvez définir des métadonnées d'objet au moment où vous les téléchargez. Après avoir téléchargé l'objet, vous ne pouvez pas modifier les métadonnées de l'objet. La seule façon de modifier les métadonnées d'un objet est de faire une copie de l'objet et de définir les métadonnées.

http://docs.aws.Amazon.com/AmazonS3/latest/dev/UsingMetadata.html

22
E.J. Brennan

Exemple PHP

Je comprends que cette question n'était pas PHP spécifique, mais cela peut aider quelqu'un car c'est un résultat de premier plan sur Google.

Cela écrasera l'objet existant.

$client = new \Aws\S3\S3Client([
    'version' => '2006-03-01',
    'region' => 'BUCKET-REGION'
]);

$updateResponse = $client->copyObject([
    'Key' => 'OBJECTKEY',
    'Bucket' =>  'MYBUCKET',
    'CopySource' => 'MYBUCKET/OBJECTKEY',
    'MetadataDirective' => 'REPLACE',
    'Metadata' => [
        'width' => 441,
        'height' => 189
    ]
]);

The Content Type was an existing metadata item

1
styks