上传Object
更新时间:2025-04-01
最简单的上传
基本流程
- 创建BosClient 类的实例。
- 调用BOSClient.putObject()方法,支持将二进制串上传Object.
- 上传成功后即返回ETag.
示例代码
Plain Text
1let etag: string;
2try {
3 etag = await bosClient.putObject(<bucketName>, <objectName>, <buf>);
4 logger.info(`put object success, etag:${etag}`);
5} catch (bosResponse) {
6 logger.error(`errCode: ${bosResponse.error.code}`)
7 logger.error(`requestId: ${bosResponse.error.requestId}`)
8 logger.error(`errMessage: ${bosResponse.error.message}`)
9 logger.error(`statusCode: ${bosResponse.statusCode}`)
10}
参数说明
参数 | 说明 |
---|---|
bucketName | 存储桶名称 |
objectName | object名称 |
buf | 二进制流,类型为ArrayBuffer |
设定Object的Http Header或者标签
BOS支持您在上传object时设定Http Header。
基本流程
- 设置BasicMeta类以及TagConf类的实例.
- 根据需要设置不同的Header以及标签.
- 将设定后的meta作为参数加入putObject()中。
示例代码
Plain Text
1let args = new BasicMeta();
2let userMeta = new TreeMap<string, string>();
3userMeta.set("region", "bj");
4userMeta.set("type", "test");
5args.userMeta = userMeta; // 用户自定义的元数据,但所有的User Meta总大小不能超过2KB。
6args.cacheControl = "private"; // 下载Object的Cache设置,常见的可取值为private、no-cache、max-age、must-revalidate
7args.contentDisposition = "inline"; // 设置浏览器是否下载,可取值为inline、attachment; filename="download.txt"
8args.storageClass = "COLD"; // 存储类型
9args.expires = "300"; // 用于设置下载Object时的缓存失效时间,如果不做时间设置,BOS则会默认设置缓存失效时间为三天。
10args.trafficLimit = 8192000; // 单链接限速,取值范围为819200 ~ 838860800,单位为bit/s,即100KB/s~100MB/s
11let tagConf = new TagConf();
12let tag1 = new Tag(); // 标签设置
13tag1.tagKey = "a";
14tag1.tagValue = "b";
15let tag2 = new Tag();
16tag1.tagKey = "c";
17tag1.tagValue = "d";
18tagConf.tags = [tag1, tag2];
19try {
20 await bosClient.putObject(<bucketName>, <objectName>, <buf>, <args>, <tagConf>);
21} catch (bosResponse) {
22 logger.error(`errCode: ${bosResponse.error.code}`)
23 logger.error(`requestId: ${bosResponse.error.requestId}`)
24 logger.error(`errMessage: ${bosResponse.error.message}`)
25 logger.error(`statusCode: ${bosResponse.statusCode}`)
26}
Append方式上传Object
BOS支持AppendObject,即以追加写的方式上传文件,适用场景如日志追加及直播等实时视频文件上传。通过AppendObject操作创建的Object类型为Appendable Object,可以对该Object追加数据;而通过PutObject上传的Object是Normal Object,不可进行数据追加写。AppendObject大小限制为0~5GB。
示例代码
Plain Text
1// 从文件中读取数据
2// 第一次append
3let appendObjectResult: AppendObjectResult;
4try {
5 // 首次append
6 appendObjectResult = await bosClient.appendObject(<bucketName>, <objectName>, <buf>);
7 logger.info(`create append object success`);
8 let args = new AppendObjectArgs(); //下一次追加写的参数
9 for (let i = 0; i < 100; ++i) {
10 args.offset = appendObjectResult.nextAppendOffset as number; // 本次追加写的偏移量
11 try {
12 appendObjectResult = await bosClient.appendObject(<bucketName>, <objectName>, <buf>, <args>);
13 logger.info(`append object success, ${i} times`);
14 } catch (bosResponse) {
15 logger.error(`errCode: ${bosResponse.error.code}`)
16 logger.error(`requestId: ${bosResponse.error.requestId}`)
17 logger.error(`errMessage: ${bosResponse.error.message}`)
18 logger.error(`statusCode: ${bosResponse.statusCode}`)
19 }
20 }
21} catch (bosResponse) {
22 logger.error(`errCode: ${bosResponse.error.code}`)
23 logger.error(`requestId: ${bosResponse.error.requestId}`)
24 logger.error(`errMessage: ${bosResponse.error.message}`)
25 logger.error(`statusCode: ${bosResponse.statusCode}`)
26}
参数说明
参数 | 说明 |
---|---|
bucketName | 存储桶名称 |
objectName | object名称 |
buf | 二进制流,类型为ArrayBuffer |
args | 追加写的参数, AppendObjectArgs类的实例 |
完整代码
Plain Text
1import fs from '@ohos.file.fs';
2import TreeMap from '@ohos.util.TreeMap';
3import { logger, Credential, BosClient, ClientOptions} from "bos"
4import { BasicMeta, TagConf, Tag, AppendObjectResult, AppendObjectArgs } from "bos/src/main/ets/bos/api/DataType"
5
6let credential = new Credential(AccessKeyID, SecretAccessKey, Token); //STS返回的临时AK/SK及Token
7let clientOptions = new ClientOptions();
8clientOptions.endpoint = "bj.bcebos.com"; //传入Bucket所在区域域名
9let bosClient = new BosClient(credential, clientOptions); // 创建BosClient
10let bucketName = "test-bucket-harmony";
11let objectName = "test-put-object";
12// 创建一个临时文件
13let cacheDir = getContext().cacheDir;
14let path = cacheDir + '/test.txt';
15let file = fs.openSync(path, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE | fs.OpenMode.TRUNC)
16fs.writeSync(file.fd, "Hello BOS");
17fs.fsyncSync(file.fd);
18fs.closeSync(file.fd);
19
20file = fs.openSync(path, fs.OpenMode.READ_ONLY); // 使用同步的方式打开文件
21let stat = fs.lstatSync(path); //获取文件的信息
22let buf = new ArrayBuffer(stat.size); //构造ArrayBuffer
23fs.readSync(file.fd, buf); // 读取文件内容
24fs.fsyncSync(file.fd);
25fs.closeSync(file.fd);
26let etag: string;
27try {
28 etag = await bosClient.putObject(bucketName, objectName, buf); //上传object
29 logger.info(`put object success, etag:${etag}`); // 打印etag
30} catch (bosResponse) {
31 logger.error(`errCode: ${bosResponse.error.code}`)
32 logger.error(`requestId: ${bosResponse.error.requestId}`)
33 logger.error(`errMessage: ${bosResponse.error.message}`)
34 logger.error(`statusCode: ${bosResponse.statusCode}`)
35}
36
37let args = new BasicMeta();
38let userMeta = new TreeMap<string, string>();
39userMeta.set("region", "bj");
40userMeta.set("type", "test");
41args.userMeta = userMeta; // 用户自定义的元数据,但所有的User Meta总大小不能超过2KB。
42args.cacheControl = "private"; // 下载Object的Cache设置,常见的可取值为private、no-cache、max-age、must-revalidate
43args.contentDisposition = "inline"; // 设置浏览器是否下载,可取值为inline、attachment; filename="download.txt"
44args.storageClass = "COLD"; // 存储类型
45args.expires = "300"; // 用于设置下载Object时的缓存失效时间,如果不做时间设置,BOS则会默认设置缓存失效时间为三天。
46args.trafficLimit = 8192000; // 单链接限速,取值范围为819200 ~ 838860800,单位为bit/s,即100KB/s~100MB/s
47let tagConf = new TagConf();
48let tag1 = new Tag(); // 标签设置
49tag1.tagKey = "a";
50tag1.tagValue = "b";
51let tag2 = new Tag();
52tag1.tagKey = "c";
53tag1.tagValue = "d";
54tagConf.tags = [tag1, tag2];
55try {
56 await bosClient.putObject(bucketName, objectName, buf, args, tagConf);
57} catch (bosResponse) {
58 logger.error(`errCode: ${bosResponse.error.code}`)
59 logger.error(`requestId: ${bosResponse.error.requestId}`)
60 logger.error(`errMessage: ${bosResponse.error.message}`)
61 logger.error(`statusCode: ${bosResponse.statusCode}`)
62}
63
64// 追加写的方式上传object
65let appendObjectResult: AppendObjectResult;
66try {
67 // 首次append
68 appendObjectResult = await bosClient.appendObject(bucketName, objectName, buf);
69 logger.info(`create append object success`);
70 let args = new AppendObjectArgs(); //下一次追加写的参数
71 // 测试多次append
72 for (let i = 0; i < 100; ++i) {
73 args.offset = appendObjectResult.nextAppendOffset as number; // 本次追加写的偏移量
74 try {
75 appendObjectResult = await bosClient.appendObject(bucketName, objectName, buf, args);
76 logger.info(`append object success, ${i} times`);
77 } catch (bosResponse) {
78 logger.error(`errCode: ${bosResponse.error.code}`)
79 logger.error(`requestId: ${bosResponse.error.requestId}`)
80 logger.error(`errMessage: ${bosResponse.error.message}`)
81 logger.error(`statusCode: ${bosResponse.statusCode}`)
82 }
83 }
84} catch (bosResponse) {
85 logger.error(`errCode: ${bosResponse.error.code}`)
86 logger.error(`requestId: ${bosResponse.error.requestId}`)
87 logger.error(`errMessage: ${bosResponse.error.message}`)
88 logger.error(`statusCode: ${bosResponse.statusCode}`)
89}