如何更改 AWS S3 中的系统元数据

How to Change System Metadata in AWS S3

我正在尝试通过 lambda 更改 s3 存储桶中图像的元数据,上传对象时会触发此 lambda。但出于某种原因,当我通过 copy_from 更新元数据时,它会添加用户元数据而不是系统元数据,如下所示:

是否有编辑系统元数据的特殊方法?我的代码是:

import json
import boto3
import urllib
s3 = boto3.resource('s3')
def lambda_handler(event, context):
    # TODO implement
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'])
    s3_object = s3.Object(bucket, key)
    s3_object.metadata.update({'Content-Type':'image/png'})
    s3_object.copy_from(CopySource={'Bucket':bucket, 'Key':key}, Metadata=s3_object.metadata, MetadataDirective='REPLACE')
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

Content-Type是属于系统定义元数据的特殊元数据,还有其他更新方式。是created/uploaded.

时根据对象的内容推导出来的

假设您要更新系统定义的 Content-Type 元数据。尝试使用此代码,它更新系统定义的元数据并添加用户定义的元数据:

    s3_object.metadata.update({'My-Metadata':'abc'})
    s3_object.copy_from(CopySource={'Bucket':BUCKET_NAME, 'Key':OBJECT_KEY}, ContentType='image/png', Metadata=s3_object.metadata, MetadataDirective='REPLACE')

正如您在此处看到的,copy_from 明确采用参数 ContentType 来更新 content-type。不需要使用元数据 json 来更新此参数。使用元数据 json 更新 其他 用户定义的参数。