使用Boto3在S3桶间复制并重命名对象后获取目标对象Key
关于Boto3复制S3对象后获取目标Key的问题
嘿,这个问题我熟!咱们先直接说结论:你用的s3_resource.meta.client.copy()方法执行成功后,不会主动返回目标对象的Key,但有几个简单靠谱的方式能确认/获取到它:
直接复用你定义的
modified_filename
毕竟这个值就是你手动指定的目标对象Key啊!只要复制操作没有抛出任何异常(比如权限错误、源对象不存在这些),那这个modified_filename就已经是目标桶里有效存在的对象Key了,完全可以直接拿来做后续操作——比如查元数据、生成访问链接啥的。主动验证复制结果并提取Key(更严谨的方式)
如果想要实打实从AWS的响应里拿到Key,复制完成后可以调用head_object()方法去确认对象存在,同时从响应里提取Key信息。给你个示例代码参考:
import boto3 # 初始化S3资源 s3_resource = boto3.resource('s3') # 配置复制参数 copy_source = {'Bucket': '你的源桶名称', 'Key': '原始文件名'} destination_bucket = '你的目标桶名称' modified_filename = '重命名后的文件名' try: # 执行复制操作 s3_resource.meta.client.copy(copy_source, destination_bucket, modified_filename) # 验证对象并获取响应 head_response = s3_resource.meta.client.head_object( Bucket=destination_bucket, Key=modified_filename ) # 从响应头里提取目标Key target_object_key = head_response['ResponseMetadata']['HTTPHeaders']['x-amz-key'] print(f"复制成功!目标对象的Key是:{target_object_key}") except Exception as e: print(f"操作失败:{str(e)}")
这里要注意,head_object()的响应里的x-amz-key就是目标对象的Key,和你传的modified_filename是一致的,这么做主要是为了严谨地确认复制确实成功了。
- 小提醒:如果复制过程抛出了异常,那说明复制没完成,这时候就不用纠结目标Key的问题了,先排查异常原因(比如权限、源对象是否存在)就行。
内容的提问来源于stack exchange,提问作者codeexplorer
相关产品推荐
相关产品推荐

