How to update metadata of an existing object in AWS S3 using python boto3?

后端 未结 3 1017
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-01 14:19

boto3 documentation does not clearly specify how to update the user metadata of an already existing S3 Object.

3条回答
  •  长情又很酷
    2020-12-01 15:13

    You can either update metadata by adding something or updating a current metadata value with a new one, here is the piece of code I am using :

    import sys
    import os 
    import boto3
    import pprint
    from boto3 import client
    from botocore.utils import fix_s3_host
    param_1= YOUR_ACCESS_KEY
    param_2= YOUR_SECRETE_KEY
    param_3= YOUR_END_POINT 
    param_4= YOUR_BUCKET
    
    #Create the S3 client
    s3ressource = client(
        service_name='s3', 
        endpoint_url= param_3,
        aws_access_key_id= param_1,
        aws_secret_access_key=param_2,
        use_ssl=True,
        )
    # Building a list of of object per bucket
    def BuildObjectListPerBucket (variablebucket):
        global listofObjectstobeanalyzed
        listofObjectstobeanalyzed = []
        extensions = ['.jpg','.png']
        for key  in s3ressource.list_objects(Bucket=variablebucket)["Contents"]:
            #print (key ['Key'])
            onemoreObject=key['Key']
            if onemoreObject.endswith(tuple(extensions)):
                listofObjectstobeanalyzed.append(onemoreObject)
        #print listofObjectstobeanalyzed
            else :
                s3ressource.delete_object(Bucket=variablebucket,Key=onemoreObject)          
        return listofObjectstobeanalyzed
    
    # for a given existing object, create metadata
    def createmetdata(bucketname,objectname):
        s3ressource.upload_file(objectname, bucketname, objectname, ExtraArgs={"Metadata": {"metadata1":"ImageName","metadata2":"ImagePROPERTIES" ,"metadata3":"ImageCREATIONDATE"}})
    
    # for a given existing object, add new metadata
    def ADDmetadata(bucketname,objectname):
        s3_object = s3ressource.get_object(Bucket=bucketname, Key=objectname)
        k = s3ressource.head_object(Bucket = bucketname, Key = objectname)
        m = k["Metadata"]
        m["new_metadata"] = "ImageNEWMETADATA"
        s3ressource.copy_object(Bucket = bucketname, Key = objectname, CopySource = bucketname + '/' + objectname, Metadata = m, MetadataDirective='REPLACE')
    
    # for a given existing object, update  a metadata with new value
    def CHANGEmetadata(bucketname,objectname):
        s3_object = s3ressource.get_object(Bucket=bucketname, Key=objectname)
        k = s3ressource.head_object(Bucket = bucketname, Key = objectname)
        m = k["Metadata"]
        m.update({'watson_visual_rec_dic':'ImageCREATIONDATEEEEEEEEEEEEEEEEEEEEEEEEEE'})
        s3ressource.copy_object(Bucket = bucketname, Key = objectname, CopySource = bucketname + '/' + objectname, Metadata = m, MetadataDirective='REPLACE')
    
    def readmetadata (bucketname,objectname):
        ALLDATAOFOBJECT = s3ressource.get_object(Bucket=bucketname, Key=objectname)
        ALLDATAOFOBJECTMETADATA=ALLDATAOFOBJECT['Metadata']
        print ALLDATAOFOBJECTMETADATA
    
    
    
    # create the list of object on a per bucket basis
    BuildObjectListPerBucket (param_4)
    
    # Call functions to see the results 
    for objectitem in listofObjectstobeanalyzed:
        # CALL The function you want 
        readmetadata(param_4,objectitem)
        ADDmetadata(param_4,objectitem)
        readmetadata(param_4,objectitem)
        CHANGEmetadata(param_4,objectitem)
        readmetadata(param_4,objectitem)
    

提交回复
热议问题