文档首页/ 对象存储服务 OBS/ SDK参考/ Harmony(公测)/ 其他接口(Harmony SDK)/ 生成带授权信息的表单上传参数(Harmony SDK)
更新时间:2024-11-07 GMT+08:00
分享

生成带授权信息的表单上传参数(Harmony SDK)

功能说明

生成用于鉴权的请求参数,以进行基于浏览器的POST表单上传。

使用SDK生成的用于鉴权的请求参数包括两个:

  • Policy,对应表单中policy字段,
  • Signature,对应表单中的x-obs-signature字段。

接口约束

  • 您必须是桶拥有者或拥有上传对象的权限,才能上传对象。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:PutObject权限,如果使用桶策略则需授予PutObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略配置对象策略
  • OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点

方法定义

createPostSignatureSync(input: CreatePostSignatureSyncInput): CreatePostSignatureSyncOutput

请求参数

表1 请求参数列表

参数名称

参数类型

是否必选

描述

input

CreatePostSignatureSyncInput

必选

参数解释:

生成带授权信息的表单上传参数接口入参,详见CreatePostSignatureSyncInput

表2 CreatePostSignatureSyncInput

参数名称

参数类型

是否可选

描述

Bucket

string

可选

参数解释

桶名。

约束限制:

  • 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。
  • 桶命名规则如下:
    • 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。
    • 禁止使用IP地址。
    • 禁止以“-”或“.”开头及结尾。
    • 禁止两个“.”相邻(如:“my..bucket”)。
    • 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。
  • 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。

默认取值:

Key

string

可选

参数解释:

对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。

例如,您对象的访问地址为examplebucket.obs.cn-north-4. emyhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。

取值范围:

长度大于0且不超过1024的字符串。

默认取值:

Expires

number

可选

参数解释:

表单上传鉴权的过期时间。

取值范围:

0~(263-1),单位:秒。

默认取值:

300

FormParams

object

可选

参数解释:

除key,policy,signature外,表单上传时的其他参数。

取值范围:

acl、cache-control、content-type、content-disposition、content-encoding、expires。

默认取值:

返回结果

表3 CreateBrowserBasedSignatureOutput

参数名称

参数类型

描述

OriginPolicy

string

参数解释:

Policy未经过base64之前的值,仅用于校验。

示例:{"expiration":"2023-09-12T12:52:59Z","conditions":[{"content-type":"text/plain"},{"bucket":"examplebucket"},{"key":"example/objectname"},]}"。

默认取值:

Policy

string

参数解释:

表单中的policy,已经base64之后的值。

示例:eyJleHBpcmF0aW9uIjoiMjAyMy0wOS0xMlQxMjo1Mjo1OVoiLCJjb25kaXRpb25zIjpbeyJjb250ZW50LXR5cGUiOiJ0ZXh0L3BsYWluIn0seyJidWNrZXQiOiJleGFtcGxlYnVja2V0In0seyJrZXkiOiJleGFtcGxlL29iamVjdG5hbWUifSxdfQ==。

默认取值:

Signature

string

参数解释:

表单中的signature。

示例:g0jQr4v9VWd1Q2FOFDG6LGfV9Cw=。

默认取值:

代码示例

 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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// 引入依赖包
import ObsClient from '@obs/esdk-obs-harmony';

// 指定存储桶名称
const bucketName = "examplebucket";
// 指定对象,此处以 example/objectname 为例
const objectKey = "example/objectname";
 // Server填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写
const server = "https://obs.cn-north-4.myhuaweicloud.com";
// 文件的本地存储路径。仅支持"internal"协议类型,"internal://cache/"为应用的私有目录,是必填字段
const sourceFile = "internal://cache/hello.txt";

// 创建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,
});

const postObject = async () => {
  const result = obsClient.createPostSignatureSync({
    // 指定存储桶名称
    Bucket: bucketName,
    // 指定对象名
    Key: objectKey,
    // 指定带授权信息的URL的过期时间。
    Expires: 3600,
    // 指定请求中携带的头域
    Headers: {
      "Content-Type": "text/plain"
    }
    // 指定表单上传时参数
    FormParams: {
      "x-obs-acl": "public-read",
      "content-type": "text/plain",
    }
  });

  let uploadTask: request.UploadTask;
  // 指定上传的配置信息,可参考鸿蒙开发者文档https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-request-V5#uploadconfig6
  let uploadConfig: request.UploadConfig = {
    url: `https://${bucketName}.${server}`,
    method: "POST",
    header: {},
    files: [{ filename: objectKey, name: "file", uri: sourceFile, type: "text/plain" }],
    data: [
      { name: "key", value: this.objectKey },
      { name: "AccessKeyId", value: this.ak },
      { name: "policy", value: result.Policy },
      { name: "signature", value: result.Signature },
      { name: "x-obs-acl", value: "public-read" },
    ],
  };
  try {
    request.uploadFile(getContext(), uploadConfig).then((data: request.UploadTask) => {
      uploadTask = data;

      uploadTask.on('progress',  (uploadedSize: number, totalSize: number) => {
        console.info('Upload delete progress notification.' + 'totalSize:' + totalSize + 'uploadedSize:' + uploadedSize);
      });
      let upCompleteCallback = (taskStates: Array<request.TaskState>) => {
        for (let i = 0; i < taskStates.length; i++) {
          console.info("upOnComplete taskState:" + JSON.stringify(taskStates[i]));
        }
      };
      uploadTask.on('complete', upCompleteCallback);

      let upFailCallback = (taskStates: Array<request.TaskState>) => {
        for (let i = 0; i < taskStates.length; i++) {
          console.info("upOnFail taskState:" + JSON.stringify(taskStates[i]));
        }
      };
      uploadTask.on('fail', upFailCallback);

    }).catch((err: BusinessError) => {
      console.error(`Failed to request the upload. Code: ${err.code}, message: ${err.message}`);
    });
  } catch (err) {
    console.error(`Failed to request the upload. err: ${JSON.stringify(err)}`);
  }
}

postObject();

相关文档