更新时间:2024-11-19 GMT+08:00
分享

快速入门(Harmony SDK)

OBS SDK对OBS服务提供的REST API进行封装,以简化用户的开发工作。您直接调用OBS SDK提供的接口函数即可使用OBS管理数据。

本章节介绍了OBS Harmony SDK的快速入门,帮助您快速上手OBS的基础功能,包括创建桶、上传对象、下载对象、列举对象。

准备工作

使用Harmony SDK之前,您需要拥有一个华为账号并实名认证、为账号充值,接着获取访问密钥、准备开发环境,然后下载并安装Harmony SDK

  1. 注册华为账号并实名认证。

    如果您已有华为账号,请忽略此步骤。如果您还没有华为账号,请执行以下操作:

    1. 注册华为账号并开通华为云注册华为账号并开通华为云。
    2. 参考个人账号如何完成实名认证企业账号如何完成实名认证,完成个人或企业账号实名认证。

  2. 为账号充值。

    您需要确保账号有足够的余额,才能正常使用OBS等相关资源。请参考账户充值

  3. 获取访问密钥,详情请参见获取访问密钥(AK和SK)
  4. 准备开发环境,详情请参见准备开发环境
  5. 下载与安装Harmony SDK,详情请参见下载与安装SDK(Harmony SDK)

步骤一:创建桶

本示例用于创建名为examplebucket的桶,并设置所在区域在华北-北京四(cn-north-4),桶的权限访问控制策略是私有桶,存储类型是低频访问存储,多AZ方式存储。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// 引入依赖包
import ObsClient, { AclType, StorageClassType, CreateBucketInput } from '@obs/esdk-obs-harmony';

// 创建ObsClient实例
const obsClient = new ObsClient({
  // 推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险
  // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
  AccessKeyId: process.env.ACCESS_KEY_ID,
  SecretAccessKey: process.env.SECRET_ACCESS_KEY,
  // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入
  // SecurityToken: process.env.SECURITY_TOKEN,
  // Server填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写
  Server: "https://obs.cn-north-4.myhuaweicloud.com",
});

async function createBucket() {
  try {
    const params: CreateBucketInput = {
      // 指定存储桶名称
      Bucket: "examplebucket",
      // 指定存储桶所在区域,此处以“cn-north-4”为例,必须跟传入的Endpoint中Region保持一致
      Location: "cn-north-4",
      // 指定存储桶的权限控制策略,此处以AclType.PRIVATE为例
      ACL: AclType.PRIVATE,
      // 指定存储桶的存储类型,此处以StorageClassType.WARM为例。如果未指定该参数,则创建的桶为低频访问存储
      StorageClass: StorageClassType.WARM,
      // 指定存储桶的AZ类型,此处以“3az”为例。不携带时默认为单AZ,如果对应region不支持多AZ存储,则该桶的存储类型仍为单AZ
      AzRedundancy: "3az",
    };
    // 创建桶
    const result = await obsClient.createBucket(params);
    if (result.CommonMsg.Status <= 300) {
      console.log("Create bucket(%s) successful!", params.Bucket);
      console.log("RequestId: %s", result.CommonMsg.RequestId);
      return;
    }
    console.log("An ObsError was found, which means your request sent to OBS was rejected with an error response.");
    console.log("Status: %d", result.CommonMsg.Status);
    console.log("Code: %s", result.CommonMsg.Code);
    console.log("Message: %s", result.CommonMsg.Message);
    console.log("RequestId: %s", result.CommonMsg.RequestId);
  } catch (error) {
    console.log("An Exception was found, which means the client encountered an internal problem when attempting to communicate with OBS, for example, the client was unable to access the network.");
    console.log(error);
  }
}

createBucket();

步骤二:上传对象

二进制文件上传,上传后的对象命名为example/objectname,对象存储在名为examplebucket的桶中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// 引入依赖包
import ObsClient, { PutObjectInput } from '@obs/esdk-obs-harmony';
import { fileIo as fs } from '@kit.CoreFileKit';

// 创建ObsClient实例
const obsClient = new ObsClient({
  // 推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险
  // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
  AccessKeyId: process.env.ACCESS_KEY_ID,
  SecretAccessKey: process.env.SECRET_ACCESS_KEY,
  // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入
  // SecurityToken: process.env.SECURITY_TOKEN,
  // Server填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写
  Server: "https://obs.cn-north-4.myhuaweicloud.com",
});

async function putObject() {

  // 指定文件路径,这里以cacheDir目录下的hello.txt为例,需要保证fs模块可以正常读取。
  let sourceFile = getContext(this).cacheDir + "/hello.txt";
  // 打开文件句柄,如果代码运行在生产环境上,推荐加上异常捕获(try...catch)逻辑。
  let file = fs.openSync(sourceFile, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  // 模拟文件内容
  fs.writeSync(file.fd, "hello Obs")
  // 获取文件属性
  let fileStat = fs.statSync(file.fd);
  // 根据文件大小 构建文件缓冲区
  let buf = new ArrayBuffer(fileStat.size);
  fs.readSync(file.fd, buf, { offset: 0 });
  // 用完记得关闭文件
  fs.closeSync(file.fd);

  try {
    const params: PutObjectInput = {
      // 指定存储桶名称
      Bucket: "examplebucket",
      // 指定对象,此处以 example/objectname 为例
      Key: "example/objectname",
      // 指定上传内容,注意这里接收的类型是ArrayBuffer
      Body: buf
    };
    // 上传对象
    const result = await obsClient.putObject(params);
    if (result.CommonMsg.Status <= 300) {
      console.log("Put object(%s) under the bucket(%s) successful!!", params.Key, params.Bucket);
      console.log("RequestId: %s", result.CommonMsg.RequestId);
      console.log("StorageClass:%s, ETag:%s", result.InterfaceResult.StorageClass, result.InterfaceResult.ETag);
      return;
    }
    console.log("An ObsError was found, which means your request sent to OBS was rejected with an error response.");
    console.log("Status: %d", result.CommonMsg.Status);
    console.log("Code: %s", result.CommonMsg.Code);
    console.log("Message: %s", result.CommonMsg.Message);
    console.log("RequestId: %s", result.CommonMsg.RequestId);
  } catch (error) {
    console.log("An Exception was found, which means the client encountered an internal problem when attempting to communicate with OBS, for example, the client was unable to access the network.");
    console.log(error);
  }
}


putObject();

步骤三:下载对象

本示例用于文本下载examplebucket桶中的example/objectname对象。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// 引入依赖包
import ObsClient, { GetObjectInput } from '@obs/esdk-obs-harmony';

// 创建ObsClient实例
const obsClient = new ObsClient({
  // 推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险
  // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.htmlhttps://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.htmlhttps://support.huaweicloud.com/eu/usermanual-ca/ca_01_0003.html
  AccessKeyId: process.env.ACCESS_KEY_ID,
  SecretAccessKey: process.env.SECRET_ACCESS_KEY,
  // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。
  // SecurityToken: process.env.SECURITY_TOKEN,
  // Server填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写。
  Server: "https://obs.cn-north-4.myhuaweicloud.com",
});

async function getObject() {
  try {
    const params: GetObjectInput = {
      // 指定存储桶名称
      Bucket: "examplebucket",
      // 指定下载对象,此处以 example/objectname 为例。
      Key: 'example/objectname',
    };
    
    // 文本下载对象
    const result = await obsClient.getObject(params);
    if (result.CommonMsg.Status <= 300) {
      console.log("Get object(%s) under the bucket(%s) successful!", params.Key, params.Bucket);
      console.log("RequestId: %s", result.CommonMsg.RequestId);
      console.log('Object Content: %s', result.InterfaceResult.Content); 
      return;
    }
    console.log("An ObsError was found, which means your request sent to OBS was rejected with an error response.")
    console.log("Status: %d", result.CommonMsg.Status);
    console.log("Code: %s", result.CommonMsg.Code);
    console.log("Message: %s", result.CommonMsg.Message);
    console.log("RequestId: %s", result.CommonMsg.RequestId);
  } catch (error) {
    console.log("An Exception was found, which means the client encountered an internal problem when attempting to communicate with OBS, for example, the client was unable to access the network.")
    console.log(error);
  }
}

getObject();

步骤四:简单列举对象

本示例用于获取名为examplebucket并行文件系统下的对象列表,其中列举的是以test/ 开头的所有对象中的按照字典顺序的最多前100个对象,并且是从起始位置test/test2开始列举。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// 引入依赖包
import ObsClient, { ListObjectsInput } from '@obs/esdk-obs-harmony';

// 创建ObsClient实例
const obsClient = new ObsClient({
  // 推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险
  // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
  AccessKeyId: process.env.ACCESS_KEY_ID,
  SecretAccessKey: process.env.SECRET_ACCESS_KEY,
  // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入
  // SecurityToken: process.env.SECURITY_TOKEN,
  // Server填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写
  Server: "https://obs.cn-north-4.myhuaweicloud.com",
});

async function listObjects() {
  try {
    const params: ListObjectsInput = {
      // 指定存储桶名称
      Bucket: "examplebucket",
      // 指定列举对象前缀,此处以“test/”前缀为例,满足指定前缀的对象会被列举
      Prefix: "test/",
      // 指定返回的最大对象数,此处以 100 为例,返回的对象列表将是按照字典顺序的最多前max-keys个对象,默认值为1000
      MaxKeys: 100,
      // 指定对象名分组的分隔符,这里以/为例。
      Delimiter = "/",
      // 指定列举对象的起始位置,此处以“test/test2”为例
      Marker: "test/test2",
      // 指定编码方式,此处以“url”为例,如果列举对象中存在特殊字符,则该参数必传
      EncodingType: "url"
    };
    // 列举桶内对象
    const result = await obsClient.listObjects(params);
    if (result.CommonMsg.Status <= 300) {
      console.log("List objects under the bucket(%s) successful!", params.Bucket);
      console.log("RequestId: %s", result.CommonMsg.RequestId);
      for (let j = 0; j < result.InterfaceResult.Contents.length; j++) {
        const val = result.InterfaceResult.Contents[j];
        console.log('Content[%d]-OwnerId:%s, ETag:%s, Key:%s, LastModified:%s, Size:%d',
          j, val.Owner.ID, val.ETag, val.Key, val.LastModified, val.Size);
      }
      return;
    }
    console.log("An ObsError was found, which means your request sent to OBS was rejected with an error response.");
    console.log("Status: %d", result.CommonMsg.Status);
    console.log("Code: %s", result.CommonMsg.Code);
    console.log("Message: %s", result.CommonMsg.Message);
    console.log("RequestId: %s", result.CommonMsg.RequestId);
  } catch (error) {
    console.log("An Exception was found, which means the client encountered an internal problem when attempting to communicate with OBS, for example, the client was unable to access the network.");
    console.log(error);
  }
}

listObjects();

相关信息

当您完成创建桶、上传对象、下载对象等基本操作后,您还可以结合业务需求使用以下Harmony SDK的高阶功能。

  • 生命周期:通过为桶配置生命周期规则,可以实现定时转换对象存储类别或定时删除对象。
  • 桶ACL权限Harmony SDK提供桶ACL访问权限方式,桶的所有者可以通过编写桶ACL,实现对桶更精细化的权限控制。
  • 桶策略Harmony SDK提供桶策略访问权限方式,桶的所有者可以通过编写桶策略,实现对桶更精细化的权限控制。
  • 静态网站托管:您可以将静态网站文件上传至OBS的桶中,并对这些文件赋予匿名用户可读权限,然后将该桶配置成静态网站托管模式,实现使用桶域名访问该网站。
  • 多版本控制:为桶开启多版本控制后,可以在桶中保留多个版本的对象,方便检索和还原各个版本,在意外操作或应用程序故障时帮助快速恢复数据。
  • 跨域资源共享(CORS):通过配置CORS规则,可以实现跨域名访问OBS。

相关文档