获取及更新元数据信息
更新时间:2025-05-12
文件元信息
设置文件元信息
文件元信息(Object Meta),是对用户在向BOS上传文件时,同时对文件进行的属性描述,主要分为分为两种:设置HTTP标准属性(HTTP Headers)和用户自定义的元信息。
- 设定Object的Http Header
BOS C SDK本质上是调用后台的HTTP接口,因此用户可以在上传文件时自定义Object的Http Header。常用的http header说明如下:
名称 | 描述 | 默认值 |
---|---|---|
Content-MD5 | 文件数据校验,设置后BOS会启用文件内容MD5校验,把您提供的MD5与文件的MD5比较,不一致会抛出错误 | 无 |
Content-Type | 文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如没有指,BOS则根据文件的扩展名自动生成,如文件没有扩展名则填默认值 | application/octet-stream |
Content-Disposition | 指示MIME用户代理如何显示附加的文件,打开或下载,及文件名称 | 无 |
Content-Length | 上传的文件的长度,超过流/文件的长度会截断,不足为实际值 | 流/文件时间长度 |
Expires | 缓存过期时间 | 无 |
Cache-Control | 指定该Object被下载时的网页的缓存行为 | 无 |
参考代码如下:
C
1...
2 bos_table_t *headers = bos_table_make(p, 2);
3 apr_table_add(headers, "x-bce-metadata-directive", "replace");
4 apr_table_add(headers, "x-bce-storage-class", "STANDARD_IA");
5...
- 用户自定义元信息
BOS支持用户自定义元数据来对Object进行描述。如下代码所示:
C
1 // 设置自定义元数据name的值为my-data
2 apr_table_add(headers, "name", "my-data");
提示:
- 在上面代码中,用户自定义了一个名字为”name”,值为”my-data”的元数据
- 当用户下载此Object的时候,此元数据也可以一并得到
- 一个Object可以有多个类似的参数,但所有的User Meta总大小不能超过2KB
只获取ObjectMetaData
通过 head_object 方法可以只获取ObjectMetaData而不获取Object的实体。
ObjectMetaData
解析类中可供调用的参数有:
参数 | 说明 |
---|---|
content_type | Object的类型 |
content_length | Object的大小 |
content_md5 | Object的MD5 |
etag | Object的HTTP协议实体标签 |
storage_class | Object的存储类型 |
user_meta | 如果在PutObject指定了userMetadata自定义meta,则返回此项 |
expires | 下载Object时的缓存失效时间 |
content_disposition | 设置浏览器是否下载,可取值为inline、attachment; filename="download.txt" |
cache_control | 下载Object的Cache设置,常见的可取值为private、no-cache、max-age、must-revalidate |
content_range | 有range的情况下返回Object的数据范围 |
获取及更新文件元信息
文件元信息(Object Metadata),是对用户上传BOS的文件的属性描述,分为两种:HTTP标准属性(HTTP Headers)和User Meta(用户自定义元信息)。
C
1 bos_pool_t *p = NULL;
2 int is_cname = 0;
3 bos_status_t *s = NULL;
4 bos_request_options_t *options = NULL;
5 bos_string_t bucket;
6 bos_string_t object;
7 bos_table_t *resp_headers = NULL;
8
9
10 //创建内存池
11 bos_pool_create(&p, NULL);
12
13
14 //初始化请求选项
15 options = bos_request_options_create(p);
16 init_test_request_options(options, is_cname);
17 bos_str_set(&bucket, TEST_BUCKET_NAME);
18
19
20 //获取对象元数据
21 bos_str_set(&object, TEST_OBJECT_NAME1);
22 s = bos_head_object(options, &bucket, &object, NULL, &resp_headers);
23 print_headers(resp_headers);
24 if (bos_status_is_ok(s)) {
25 printf("head object succeeded\n");
26 } else {
27 printf("head object failed\n");
28 }
29
30
31 //销毁内存池
32 bos_pool_destroy(p);
修改文件元信息
BOS修改Object的Metadata通过拷贝Object实现。即拷贝Object的时候,把目的Bucket设置为源Bucket,目的Object设置为源Object,并设置新的Metadata,通过拷贝自身实现修改Metadata的目的。如果不设置新的Metadata,则报错。
C
1 bos_pool_t *p = NULL;
2 int is_cname = 0;
3 bos_status_t *s = NULL;
4 bos_request_options_t *options = NULL;
5 bos_string_t bucket;
6 bos_string_t object;
7 bos_string_t src_bucket;
8 bos_string_t src_object;
9 bos_string_t src_endpoint;
10 bos_table_t *resp_headers = NULL;
11
12
13 //创建内存池
14 bos_pool_create(&p, NULL);
15
16 //初始化请求选项
17 options = bos_request_options_create(p);
18 init_test_request_options(options, is_cname);
19 bos_str_set(&bucket, TEST_BUCKET_NAME);
20
21
22 //设置对象复制
23 bos_str_set(&object, TEST_OBJECT_NAME2);
24 bos_str_set(&src_bucket, TEST_BUCKET_NAME);
25 bos_str_set(&src_endpoint, TEST_BOS_ENDPOINT);
26 bos_str_set(&src_object, TEST_OBJECT_NAME1);
27 bos_table_t *headers = bos_table_make(p, 2);
28
29 bos_copy_object_params_t *params = NULL;
30 params = bos_create_copy_object_params(p);
31 s = bos_copy_object(options, &src_bucket, &src_object, &bucket, &object, headers, params, &resp_headers);
32 if (bos_status_is_ok(s)) {
33 printf("put object copy succeeded\n");
34 } else {
35 printf("put object copy failed\n");
36 }
37
38
39 //销毁内存池
40 bos_pool_destroy(p);