Search code examples
javagrailsamazon-web-servicesamazon-s3jclouds

How do I update metadata for an existing Amazon S3 file?


I need to update the cache control header in all AmazonS3's Cloud Files. However, I can't figure out how I do that using the jclouds API. I'm using apache jclouds plugin. And I got two related answers:

The first answer is suggesting to use SwiftKey Api class which is not available in grails's jcloud plugin. The second answer is using AWS java sdk for which there is already a grails wrapping plugin https://grails.org/plugin/aws-sdk but it doesn't support metadata update.


Solution

  • It is possible to change the metadata by performing an object copy (see How to update metadata using 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);
    

    Whether this is philosophically an "update" is up to you to decide.