对象键和元数据 - Amazon Simple Storage Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

对象键和元数据

每个 Amazon S3 对象都有数据、键和元数据。TheThethe 对象密钥 (或密钥名称)唯一标识一个桶中的对象。对象元数据 是一组名称值对。您可以在上传对象元数据时对其进行设置。上传对象后,您将无法修改对象元数据。修改对象元数据的唯一方式是创建对象的副本并设置元数据。

对象键

创建对象时,要指定键名,它在存储桶中唯一地标识该对象。例如, Amazon S3 控制台,当您突出显示一个桶时,会显示您的桶中的对象列表。这些名称是 对象密钥. 键的名称是 Unicode 字符序列,它的 UTF-8 编码长度最大为 1,024 字节。

TheThethe Amazon S3 数据模型是一个平面结构: 您创建了一个桶子,而且桶存储对象。不存在子存储桶或子文件夹的层次结构。但您可以使用键名前缀和分隔符推断逻辑层次结构(如同 Amazon S3 控制台一样)。TheThethe Amazon S3 控制台支持文件夹概念。

假设您的存储桶 (admin-created) 包含具有以下对象键的四个对象:

Development/Projects.xls

Finance/statement1.pdf

Private/taxdocument.pdf

s3-dg.pdf

控制台使用密钥名称前缀(Development/Finance/,和 Private/)和分隔符('/')显示文件夹结构,如所示。


          Amazon S3 控制台屏幕截图,显示 Development、Finance 和 Private 文件夹。

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


          Amazon S3 控制台屏幕截图,在 Development 文件夹中选中了 Projects.xlsx 文件。
注意

Amazon S3 支持存储桶和对象且没有层次结构。但是,通过在对象键名中使用前缀和分隔符,Amazon S3 控制台和 AWS 开发工具包可以推断层次结构并引入文件夹的概念。

对象键命名准则

您可以在对象键名中使用任意 UTF-8 字符。但是,在键名中使用某些字符可能导致一些应用程序和协议出现问题。以下指导原则有助于最大程度符合 DNS、Web 安全字符、XML 分析器和其他 API 的要求。

安全字符

以下字符集通常可安全地用于键名。

Alphanumeric characters
  • 0-9

  • a-z

  • A-Z

Special characters
  • 正斜杠(/)

  • 感叹号(!)

  • 连字符(-)

  • 下划线(_)

  • Period.)

  • 星号(*)

  • 单报价(')

  • 开放括号(()

  • 关闭括号())

以下是有效对象键名的示例:

  • 4my-organization

  • my.great_photos-2014/jan/myvacation.jpg

  • videos/2014/birthday/video1.wmv

重要

如果对象键名称以单个句点 (.) 或两个句点 (..) 结尾,您将无法使用 Amazon S3 控制台下载该对象。要下载一个以“.”结尾的关键名称的对象。或“..”,您必须使用 AWS Command Line Interface (AWS CLI)、AWSSDK或RESTAPI。

可能需要特殊处理的字符

键名中的以下字符可能需要另外进行代码处理,并且可能需要以十六进制形式在 URL 中编码或引用。其中部分字符是不可打印的字符,浏览器可能无法处理它们,这也需要特殊处理:

  • 表示和的符号 (“&”)

  • 美元 (“$”)

  • ASCII字符范围00–1F六角(0)–31小时)和7F(127小时)

  • “At”符号 (“@”)

  • 等于 (“=”)

  • 分号 (“;”)

  • 冒号 (“:”)

  • 加号 (“+”)

  • 空格 – 大量连续空格可能会在某些使用情形中丢失(特别是多个空格)

  • 逗号 (“,”)

  • 问号 (“?”)

要避免的字符

避免在键名中使用以下字符,因为这些字符需要进行大量的特殊处理,才能在所有应用程序间保持一致性。

  • 反斜杠 ("\")

  • 左大括号 (“{”)

  • 不可打印的 ASCII 字符(128–255 十进制字符)

  • 插入符号 (“^”)

  • 右大括号 (“}”)

  • 百分比字符 (“%”)

  • 重音符/反勾号 (“`”)

  • 右方括号 (“]”)

  • 引号

  • “大于”符号 (“>”)

  • 左方括号 (“[”)

  • 波浪字符 (“~”)

  • “小于”符号(“<”)

  • “井号”字符 (“#”)

  • 竖线 (“|”)

对象元数据

元数据有两种类型: 系统元数据用户定义的元数据.

系统定义的对象元数据

对于存储在桶中的每个对象, Amazon S3 维护一组系统元数据。 Amazon S3 根据需要处理此系统元数据。例如,Amazon S3 将保留对象创建日期和大小元数据,并将这些信息用作对象管理的一部分。

有两种类别的系统元数据:

  1. 元数据(如对象创建日期)受系统控制,仅 Amazon S3 可以修改其值。

  2. 其他系统元数据 (例如为对象配置的存储类以及指示对象是否已启用服务器端加密的数据) 是您可以控制其值的系统元数据的示例。如果您的存储桶配置为网站,有时您可能想要将页面请求重定向到其他页面或外部 URL。这种情况下,网页是存储桶中的对象。Amazon S3 将页面重定向值存储为您可以控制其值的系统元数据。

    创建对象时,您可以配置这些系统元数据项目的值或在需要时更新这些值。有关存储类的更多信息,请参阅Amazon S3 存储类.

    有关服务器端加密的更多信息,请参阅使用加密保护数据.

下表提供了系统定义的元数据列表以及您是否可以更新它。

姓名 Description 用户是否可以修改该值?
Date 当前日期和时间。
内容长度 对象大小以字节为单位。
Content-Type 对象类型。
上次修改日期

对象创建日期或上次修改日期 (以较晚者为准)。

Content-MD5 对象的 base64 编码的 128 位 MD5 摘要。
x-amz-server-side-encryption 表示是否为对象启用了服务器端加密,以及是否对该对象启用了该加密 AWS Key Management Service (AWS KMS)或 Amazon S3 管理加密(SSE-S3)。有关更多信息,请参阅 使用服务器端加密保护数据.
x-amz-version-id 对象版本。在存储桶上启用版本控制时,Amazon S3 会为添加到存储桶的对象指定版本号。有关更多信息,请参阅 使用版本控制.
x-amz-delete-marker 在启用版本控制的存储桶中,此布尔值标记指示对象是否为删除标记。
x-amz-storage-class 用于存储对象的存储类。有关更多信息,请参阅 Amazon S3 存储类.
x-amz-website-redirect-location 将相关联的对象的请求重定向到同一存储桶中的其他对象或外部 URL。有关更多信息,请参阅 (可选)配置网页重定向.
x-amz-server-side-encryption-aws-kms-key-id 如果X-AMZ服务器端加密存在,并且具有 aws:kms,这表示ID的ID AWS KMS 对象使用的对称客户主密钥(CMK)。
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 使用小写存储用户定义的元数据键。

Amazon S3 允许元数据值中有任意 Unicode 字符。

为避免与这些元数据值显示有关的问题,如果使用 SOAP 或通过 POST 进行基于浏览器的上传,则当使用 REST 和 UTF-8 时,应遵守使用 US-ASCII 字符的规定。

在元数据值中使用非 US-ASCII 字符时,将检查提供的 Unicode 字符串中是否存在非 US-ASCII 字符。如果字符串仅包含 US-ASCII 字符,则按原样显示。如果字符串包含非 US-ASCII 字符,则首先使用 UTF-8 进行字符编码,然后编码为 US-ASCII。

示例:

PUT /Key HTTP/1.1 Host: awsexamplebucket1.s3.amazonaws.com x-amz-meta-nonascii: ÄMÄZÕÑ S3 HEAD /Key HTTP/1.1 Host: awsexamplebucket1.s3.amazonaws.com x-amz-meta-nonascii: =?UTF-8?B?w4PChE3Dg8KEWsODwpXDg8KRIFMz?= PUT /Key HTTP/1.1 Host: awsexamplebucket1.s3.amazonaws.com x-amz-meta-ascii: AMAZONS3 HEAD /Key HTTP/1.1 Host: awsexamplebucket1.s3.amazonaws.com x-amz-meta-ascii: AMAZONS3
注意

PUT 请求标头的大小限制为 8 KB。在 PUT 请求标头中,用户定义的元数据的大小限制为 2 KB。通过计算每个键和值的 UTF-8 编码中的字节总数来测量用户定义的元数据的大小。

有关将元数据添加到对象上传之后的信息,请参阅 如何将元数据添加到S3对象?Amazon Simple Storage Service 控制台用户指南.