对象概述
对象(Object)是OBS中数据存储的基本单位,一个对象实际是一个文件的数据与其相关属性信息(元数据)的集合体。用户上传至OBS的数据都以对象的形式保存在桶中。
- Key:键值,即对象的名称,为经过UTF-8编码的长度大于0且不超过1024的字符序列。一个桶里的每个对象必须拥有唯一的对象键值。
- Metadata:元数据,即对象的描述信息,包括系统元数据和用户元数据,这些元数据以键值对(Key-Value)的形式被上传到OBS中。
- 系统元数据由OBS自动产生,在处理对象数据时使用,包括Date,Content-length,Last-modify,Content-MD5等。
- 用户元数据由用户在上传对象时指定,是用户自定义的对象描述信息。
- Data:数据,即文件的数据内容。
通常,我们将对象等同于文件来进行管理,但是由于OBS是一种对象存储服务,并没有文件系统中的文件和文件夹概念。为了使用户更方便进行管理数据,OBS提供了一种方式模拟文件夹。通过在对象的名称中增加“/”,例如“test/123.jpg”。此时,“test”就被模拟成了一个文件夹,“123.jpg”则模拟成“test”文件夹下的文件名了,而实际上,对象名称(Key)仍然是“test/123.jpg”。
上传对象时,可以指定对象的存储类别、,如果不指定,默认与桶的存储类别一致。上传后,对象的存储类别可以修改。
您可以根据使用习惯、业务场景通过多种使用方式将文件(数据)上传至桶,OBS最终将这些文件以对象的形式存储在桶中。OBS中桶和对象按区域划分,无论您通过哪种方式使用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控制台一样),OBS控制台支持文件夹的概念。假设您的桶(companybucket)包含具有以下对象键的四个对象:
- bucket-log/log01.txt
- cgvbs/test1.txt
- 2015-10-14_111756.png
- test1.txt
控制台使用键名称前缀(bucket-log/和cgvbs/)和分隔符(“/”)呈现如下所示的文件夹结构:
2015-10-14_111756.png和test1.txt键没有前缀,因此其对象直接在桶的根级别出现。如果打开cgvbs/文件夹,则您会看到其中包含test1.txt对象。
假设您的桶(companybucket)包含以下对象键的两个对象:
- obj
- 1/../obj
当您直接访问API来获取对象(例如:使用SDK)则能正确获取,当使用console控制台来访问时,浏览器针对相对关系实际发送的请求会访问obj对象,因“../”在uri中特殊语义,请尽量避免出现在对象键中。
禁止创建以“..”开头的对象名。