如何使用boto3上传携带字典类型自定义元数据的文件到S3
结论
你想要的直接传入字典类型的元数据需求无法直接通过boto3实现,这是AWS S3本身的限制,和boto3版本无关。
原因说明
S3的自定义元数据仅支持字符串类型的键值对,所有自定义元数据的键、值都必须是可UTF-8编码的字符串,且所有元数据的总大小不能超过2KB,原生不支持字典、列表等复杂数据结构。
可行的替代方案
你可以将字典/列表类型的复杂数据序列化为字符串后存入元数据,读取时再反序列化为原结构,最常用的序列化方式是JSON:
上传时的示例代码
import json import boto3 s3 = boto3.resource('s3') s3_object = s3.Object(s3_bucket_name, s3_path) # 把需要存入的复杂结构序列化为JSON字符串 my_complex_meta = { "my_meta_1": [ "any_string" ] } serialized_meta = json.dumps(my_complex_meta) s3_object.put( Body=my_random_file, Metadata={"my_meta": serialized_meta} )
读取元数据时的示例代码
# 读取S3对象的元数据 s3_object = s3.Object(s3_bucket_name, s3_path) serialized_meta = s3_object.metadata['my_meta'] # 反序列化得到原来的字典结构 my_complex_meta = json.loads(serialized_meta)
注意事项
- 如果你的复杂数据结构较大,序列化后的字符串长度可能会超过S3元数据2KB的总大小限制,这种情况建议你将复杂元数据单独存为一个JSON文件,和原zip文件放在同一路径下,不要直接存在对象的元数据中。
- 如果元数据中包含非UTF-8编码的内容,需要先做转码处理再序列化。
内容的提问来源于stack exchange,提问作者gggert
相关产品推荐
相关产品推荐

