You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:18:01