对象键和元数据
每个 Amazon S3 对象都有数据、键和元数据。对象键 (或键名) 在存储桶中唯一地标识对象。对象元数据是一组名称值对。您可以在上传对象元数据时对其进行设置。上传对象后,您将无法修改对象元数据。修改对象元数据的唯一方式是创建对象的副本并设置元数据。
对象键
创建对象时,要指定键名,它在存储桶中唯一地标识该对象。例如,在 Amazon S3 控制台中(参阅 AWS 管理控制台),在突出显示存储桶时,将显示存储桶中的对象的列表。这些名称是对象键。键的名称是一序列的 Unicode 字符,它的 UTF-8 编码长度最大为 1024 个字节。
Amazon S3 数据模型是一种扁平结构:您创建存储桶,存储桶存储对象。不存在子存储桶或子文件夹层次结构;但您可以使用键名前缀和分隔符推断逻辑层次结构 (如同 Amazon
S3 控制台一样)。Amazon S3 控制台支持文件夹的概念。假设您的存储桶 (admin-created
) 包含具有以下对象键的四个对象:
Development/Projects1.xls
Finance/statement1.pdf
Private/taxdocument.pdf
s3-dg.pdf
控制台使用键名前缀 (Development/
、Finance/
和 Private/
) 和分隔符 (“/”) 呈现如下所示的文件夹结构:

s3-dg.pdf
键没有前缀,因此其对象直接在存储桶的根级别出现。如果您打开 Development/
文件夹,可以看到 Projects.xlsx
对象。

注意
Amazon S3 支持存储桶和对象,且 Amazon S3 中没有层次结构。但是,通过对象键名中的前缀和分隔符,Amazon S3 控制台和 AWS 开发工具包可以推断层次结构并引入文件夹的概念。
对象键命名指导原则
您可以在对象键名中使用任意 UTF-8 字符。但是,在键名中使用某些字符会导致一些应用程序和协议出现问题。以下指导原则有助于最大程度符合 DNS、Web 安全字符、XML 分析器和其他 API 的要求。
安全字符
以下字符集通常可安全地用于键名:
字母数字字符 |
|
特殊字符 |
|
以下是有效对象键名的示例:
-
4my-organization
-
my.great_photos-2014/jan/myvacation.jpg
-
videos/2014/birthday/video1.wmv
可能需要特殊处理的字符
键名中的以下字符可能需要另外进行代码处理,并且可能需要以十六进制形式在 URL 中编码或引用。其中部分字符是不可打印的字符,浏览器可能无法处理它们,这也需要特殊处理:
-
表示和的符号 (“&”)
-
美元 (“$”)
-
ASCII 字符范围 00–1F 十六进制(0–31 十进制)和 7F(127 十进制)
-
“At”符号 (“@”)
-
等于 (“=”)
-
分号 (“;”)
-
冒号 (“:”)
-
加号 (“+”)
-
空格 – 大量连续空格可能会在某些使用情形中丢失(特别是多个空格)
-
逗号 (“,”)
-
问号 (“?”)
要避免的字符
避免在键名中使用以下字符,因为这些字符需要进行大量的特殊处理,才能在所有应用程序间保持一致性。
-
反斜杠 ("\")
-
左大括号 (“{”)
-
不可打印的 ASCII 字符(128–255 十进制字符)
-
插入符号 (“^”)
-
右大括号 (“}”)
-
百分比字符 (“%”)
-
重音符/反勾号 (“`”)
-
右方括号 (“]”)
-
引号
-
“大于”符号 (“>”)
-
左方括号 (“[”)
-
波浪字符 (“~”)
-
“小于”符号(“<”)
-
“井号”字符 (“#”)
-
竖线 (“|”)
对象元数据
有两种元数据:系统元数据和用户定义的元数据。
系统定义的元数据
对于存储桶中存储的每个对象, 均保留一组系统元数据。Amazon S3 根据需要处理这些系统元数据。例如,Amazon S3 将保留对象创建日期和大小元数据,并将这些信息用作对象管理的一部分。
有两种类别的系统元数据:
下表提供了系统定义的元数据列表以及您是否可以更新它。
名称 | 描述 | 用户是否可以修改该值? |
---|---|---|
日期 | 当前日期和时间。 | 否 |
内容长度 | 对象大小以字节为单位。 | 否 |
上次修改日期 |
对象创建日期或上次修改日期 (以较晚者为准)。 |
否 |
Content-MD5 | 对象的 base64 编码的 128 位 MD5 摘要。 | 否 |
x-amz-server-side-encryption | 指示是否为对象启用了服务器端加密,以及加密是来自 AWS Key Management Service (SSE-KMS) 还是来自 AWS 托管加密 (SSE-S3)。有关更多信息,请参阅 使用服务器端加密保护数据。 | 是 |
x-amz-version-id | 对象版本。在存储桶上启用版本控制时,Amazon S3 会为添加到存储桶的对象指定版本号。有关更多信息,请参阅 使用版本控制。 | 否 |
x-amz-delete-marker | 在启用版本控制的存储桶中,此布尔值标记指示对象是否为删除标记。 | 否 |
x-amz-storage-class | 用于存储对象的存储类别。有关更多信息,请参阅 存储类别。 | 是 |
x-amz-website-redirect-location | 将相关联的对象的请求重定向到同一存储桶中的其他对象或外部 URL。有关更多信息,请参阅 (可选) 配置网页重定向。 | 是 |
x-amz-server-side-encryption-aws-kms-key-id | 如果 x-amz-server-side-encryption 存在并具有值 aws:kms ,则它表示用于对象的 AWS Key Management Service (AWS KMS) 主加密密钥的 ID。
|
是 |
x-amz-server-side-encryption-customer-algorithm | 指示是否启用了具有客户提供的加密密钥的服务器端加密 (SSE-C)。有关更多信息,请参阅 通过使用客户提供的加密密钥的服务器端加密 (SSE-C) 保护数据。 | 是 |
用户定义的元数据
上传对象时,您也可以将元数据指定给该对象。发送 PUT 或 POST 请求创建对象时,您将以名称-值 (键-值) 对的形式提供此可选信息。如果使用 REST API 上传对象,可选的用户定义的元数据名称必须以“x-amz-meta-”开头,以与其他 HTTP 标头区分开来。使用 REST API 检索对象时,将返回此前缀。如果使用 SOAP API 上传对象则无需前缀。使用 SOAP API 检索对象时,无论您使用哪种 API 上传对象,都将删除前缀。
注意
HTTP 上的 SOAP 支持已弃用,但是仍可在 HTTPS 上使用。对于 SOAP 将不支持新 Amazon S3 功能。我们建议您使用 REST API 或 AWS 开发工具包。
通过 REST API 检索元数据时,Amazon S3 会将同名 (忽略大小写) 标头合并为逗号分隔的列表。如果某些元数据包含不可打印的字符,则不会返回它。但是,x-amz-missing-meta
标头将与不可打印的元数据条目的数量值一起返回。
用户定义的元数据是一组键值对。Amazon S3 使用小写存储用户定义的元数据键。使用 REST 时,每个键-值对都必须符合 US-ASCII;使用 SOAP,或通过 POST 进行基于浏览器的上传时,每个键-值对都必须符合 UTF-8。
注意
PUT 请求标头的大小限制为 8 KB。在 PUT 请求标头中,用户定义的元数据的大小限制为 2 KB。通过计算每个键和值的 UTF-8 编码中的字节总数来测量用户定义的元数据的大小。
有关在上传对象后向其中添加元数据的信息,请参阅 Amazon Simple Storage Service 控制台用户指南 中的如何向 S3 对象添加元数据?