# 对象概述
对象（Object）是OBS中数据存储的基本单位，一个对象实际是一个文件的数据与其相关属性信息（元数据）的集合体。用户上传至OBS的数据都以对象的形式保存在[桶](https://support.huaweicloud.com/usermanual-obs/obs_41_0008.html)中。
对象包括了Key，Metadata，Data三部分：
- Key：键值，即对象的名称，为经过UTF-8编码的长度大于0且不超过1024的字符序列。一个桶里的每个对象必须拥有唯一的对象键值。
- Metadata：元数据，即对象的描述信息，包括系统元数据和用户元数据，这些元数据以键值对（Key-Value）的形式被上传到OBS中。
  - 系统元数据由OBS自动产生，在处理对象数据时使用，包括Date，Content-Length，Last-Modified，Content-MD5等。
  
  - 用户元数据由用户在上传对象时指定，是用户自定义的对象描述信息。
   
- Data：数据，即文件的数据内容。
 
通常，我们将对象等同于文件来进行管理，但是由于OBS是一种对象存储服务，并没有文件系统中的文件和文件夹概念。为了使用户更方便进行管理数据，OBS提供了一种方式模拟文件夹。通过在对象的名称中增加"/"，例如"test/123.jpg"。此时，"test"就被模拟成了一个文件夹，"123.jpg"则模拟成"test"文件夹下的文件名了，而实际上，对象名称（Key）仍然是"test/123.jpg"。
上传对象时，可以指定对象的[存储类别](https://support.huaweicloud.com/usermanual-obs/obs_41_0006.html)，如果不指定，默认与桶的存储类别一致。上传后，对象的存储类别可以修改。
您可以根据使用习惯、业务场景通过多种使用方式将[文件（数据）上传至桶](https://support.huaweicloud.com/usermanual-obs/zh-cn_topic_0045829661.html)，OBS最终将这些文件以对象的形式存储在桶中。OBS中桶和对象按[区域](https://support.huaweicloud.com/usermanual-obs/obs_41_0003.html)划分，无论您通过哪种方式使用OBS，都可以通过其他方式在同一区域访问相同的桶及桶内资源。
#### 对象键命名指导原则
虽然您可以在对象键名称中使用任何UTF-8字符，但是按照以下规则命名有助于确保与其他应用程序的最大兼容性。每个应用程序对特殊字符的分析方式可能不同。以下指导原则有助于最大程度符合DNS、Web安全字符、XML分析器和其他API的要求。
以下字符集通常可安全地用于键名称：
| 字母数字字符（通常也被称为非保留字符） |                                                                                                                                                                                                                                                                                                                                                                                         \[0-9a-zA-Z\]                                                                                                                                                                                                                                                                                                                                                                                         |
|---|---|
| 特殊英文字符（通常也被称为保留字符）    | 感叹号（"!"） 连字符（"-"） 下划线（"_"） 句点（"."） 星号（"\*"） 单引号（"'"） 左括号（"("） 右括号（")"） |
   
以下是有效对象键名称的示例：
```
4my-organization 
my.great_photos-2014/jan/myvacation.jpg 
videos/2014/birthday/video1.wmv
```
#### 对保留字符的百分号编码
如果一个保留字符在URI中具有特殊含义（称作"reserved purpose"）, 且URI中必须使用该字符用于其它目的，那么该字符必须百分号编码。OBS服务对非ASCII字符编码必须采用UTF-8编码，否则最终上传至OBS的对象名可能与预期不符。例如，保留字符"/"，如果将其用作URI的路径成分的分隔符, 则是具有特殊含义的保留字符（在OBS中用来分隔桶名和对象名）。如果该字符需要出现在URI一个路径成分的内部, 则需要使用三个字符"%2F"或"%2f"代替原来的"/"。保留字符 " "，需要将其编码为"%20"，例如字符串"abc d"，应该编码为"abc%20d"。
#### 可能需要特殊处理的字符
键名中的以下字符可能需要另外进行代码处理：
- 和符号（"\&"）
- 美元（"$"）
- 分号（";"）
- 冒号（":"）
- 加号（"+"）：OBS服务会将请求URI中的"+"解码成空格，因此如果原始的对象键名称中包含"+"，需要编码成%2B之后再放入请求URI中。
- 空格 : 大量连续空格可能会在某些使用情形中丢失（特别是多个空格）。
- 等于（"="）
- At符号（"@"）
- 逗号（","）
- 问号（"?"）
- ASCII字符范围00--1F十六进制（0--31十进制）和7F（127 十进制）
避免在键名中使用以下字符，因为这些字符需要进行大量的特殊处理，才能在所有应用程序间保持一致性。
- 反斜杠（"\\"）
- 左大括号（"{"）
- 不可打印的ASCII字符（128--255十进制字符）
- 插入符号 ("\^")
- 右大括号 ("}")
- 百分比字符 ("%")
- 重音符/反勾号 ("\`")
- 右方括号 ("\]")
- 引号
- "大于"符号 ("\>")
- 左方括号 ("\[")
- 波浪字符 ("\~")
- "小于"符号（"\<"）
- "井号"字符 ("#")
- 竖线 ("\|")
请注意，OBS数据模型是一种扁平结构：您创建桶，桶存储对象。不存在子桶或子文件夹层次结构。但您可以使用键名称前缀和分隔符推断逻辑层次结构（如同OBS[管理控制台](https://console.huaweicloud.com/console/?locale=zh-cn#/obs/manager/buckets)一样），OBS控制台支持文件夹的概念。假设您的桶（companybucket）包含具有以下对象键的四个对象：
- bucket-log/log01.txt
- cgvbs/test1.txt
- 2015-10-14_111756.png
- test1.txt
[管理控制台](https://console.huaweicloud.com/console/?locale=zh-cn#/obs/manager/buckets)使用键名称前缀（bucket-log/和cgvbs/）和分隔符（"/"）呈现如下所示的文件夹结构：
![](https://support.huaweicloud.com/usermanual-obs/figure/zh-cn_image_0000002313033749.png "点击放大")
2015-10-14_111756.png和test1.txt键没有前缀，因此其对象直接在桶的根级别出现。如果打开cgvbs/文件夹，则您会看到其中包含test1.txt对象。
![](https://support.huaweicloud.com/usermanual-obs/figure/zh-cn_image_0000002278433194.png "点击放大")
假设您的桶（companybucket）包含以下对象键的两个对象：
- obj
- 1/../obj 或 1/./obj
当您使用API/SDK/OBS Browser+来获取对象则能正确获取，当使用OBS控制台来访问时，浏览器针对相对关系实际发送的请求会访问obj对象，因"../"和"./"在URI中特殊语义，请尽量避免出现在对象键中。此外，当对象名称中包含"../"或"./"时，也不支持在OBS[管理控制台](https://console.huaweicloud.com/console/?locale=zh-cn#/obs/manager/buckets)编辑对象（如：转换存储类别、配置生命周期等）。
禁止创建以".."或"."开头的对象名。
#### 几种校验对象数据完整性的方式
OBS支持使用ETag、Content-MD5、x-obs-meta-md5chksum、x-obs-checksum-crc64ecma进行数据的完整性校验：
表1OBS支持的数据校验方法 
| 对比维度  | ETag                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | Content-MD5                                                                                                                                                                                                                                                                                                                                           | x-obs-meta-md5chksum                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | x-obs-checksum-crc64ecma                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|:---|:---|:---|
| 适用场景   | 判断**服务端**的对象是否被改动。多用于HTTP缓存协商，If-Match/If-None-Match 条件复制/下载等。 **不适用**于分段上传、服务端加密场景。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | 保障**上传**数据的完整性，避免由于网络丢包、恶意攻击等原因导致文件损坏或缺失。 仅适用于单次请求，请求完成后即失效，后续下载、复制等操作无法获取。                                                                                                                                                                                                | 保障**上传、下载** 数据的完整性。与ETag、Content-MD5相比能够有效校验**分段上传**的数据一致性。因为长期存储在对象元数据中，下载场景也可以使用。                                                                                                                                                                                                                                                                                                                                                                                                                                         | 保障**上传、下载、复制** 数据的完整性。与ETag、Content-MD5相比能够有效校验**分段上传** 、**服务端加密场景**的数据一致性。因为长期存储在对象元数据中，后续下载、复制等场景也可以使用。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| 分段上传场景 | - 单个分段ETag=分段的MD5值  - 整个对象的ETag=拼接所有分段的MD5值，计算拼接后字符的MD5   说明： 不建议使用ETag校验分段上传对象的一致性                                                                                                                                                                                                                                               | - 单个分段ETag=分段的MD5值  - 无法校验整个对象的MD5   | 等于完整对象的MD5值                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | 等于完整对象的crc64值                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| 服务端加密场景 | 等于对象**密文**的MD5值 说明： 不建议使用ETag校验加密对象的一致性                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | 等于对象**明文**的MD5值                                                                                                                                                                                                                                                                                                                                        | 等于对象**密文**的MD5值 说明： 不建议使用x-obs-meta-md5chksum校验加密对象的一致性                                                                                                                                                                                                                                                                                                                                                                                        | 等于对象**明文**的crc64值                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| 校验算法   | MD5                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | MD5                                                                                                                                                                                                                                                                                                                                                  | MD5                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | crc64                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| 实现原理   | 无需客户端传入，OBS服务端自动计算生成，作为对象的系统元数据存储在服务端。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | 客户端上传时自行计算并添加到请求头域中，上传完成后即失效，服务端不保存。                                                                                                                                                                                                                                                                                                                  | 客户端上传时自行计算并添加到请求头域中，服务端收到后作为对象的系统元数据长期存储在服务端。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | 客户端上传时自行计算并添加到请求头域中，服务端收到后作为对象的系统元数据长期存储在服务端。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| 存储方式    | 对象系统元数据                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | 不存储，仅单次上传生效                                                                                                                                                                                                                                                                                                                                            | 对象自定义元数据                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | 对象系统元数据                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| 使用方式    | 控制台、API、SDK、OBS Browser+、obsutil均会生成ETag                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | API、SDK                                                                                                                                                                                                                                                                                                                                                | OBS Browser+、obsutil、SDK                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | API、SDK                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| 相关文档   | - [API公共返回结果](https://support.huaweicloud.com/api-obs/obs_04_0013.html)包含响应头域ETag  - [上传对象接口](https://support.huaweicloud.com/api-obs/obs_04_0080.html)包含响应头域ETag  - [下载对象接口](https://support.huaweicloud.com/api-obs/obs_04_0083.html)包含响应头域ETag   | [上传对象接口](https://support.huaweicloud.com/api-obs/obs_04_0080.html)包含请求头域Content-MD5                                                                                                                                                                                                                                                                    | - [基于crc64或MD5的OBS数据完整性校验](https://support.huaweicloud.com/bestpractice-obs/obs_05_0801.html)中使用MD5校验数据完整性  - [使用obsutil上传对象](https://support.huaweicloud.com/utiltg-obs/obs_11_0013.html)中的vmd5参数   | - [上传对象接口](https://support.huaweicloud.com/api-obs/obs_04_0080.html)中的请求头域x-obs-checksum-crc64ecma  - [下载对象接口](https://support.huaweicloud.com/api-obs/obs_04_0083.html)中的响应头域x-obs-checksum-crc64ecma  - [基于crc64或MD5的OBS数据完整性校验](https://support.huaweicloud.com/bestpractice-obs/obs_05_0801.html)中使用crc64校验数据完整性   |
   
