上传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}