更新时间:2024-05-31 GMT+08:00

对象概述

对象(Object)是OBS中数据存储的基本单位,一个对象实际是一个文件的数据与其相关属性信息(元数据)的集合体。用户上传至OBS的数据都以对象的形式保存在中。

对象包括了Key,Metadata,Data三部分:
  • 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中特殊语义,请尽量避免出现在对象键中。

禁止创建以“..”开头的对象名。