生成带授权信息的表单上传参数(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
请求参数
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
input |
必选 |
参数解释: 生成带授权信息的表单上传参数接口入参,详见CreatePostSignatureSyncInput。 |
参数名称 |
参数类型 |
是否可选 |
描述 |
---|---|---|---|
Bucket |
string |
可选 |
参数解释: 桶名。 约束限制:
默认取值: 无 |
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。 默认取值: 无 |
返回结果
参数名称 |
参数类型 |
描述 |
---|---|---|
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(); |