存储桶操作
简介
本文档提供关于存储桶的基本操作和访问控制列表(ACL)的相关 API 概览以及 SDK 示例代码。
基本操作
API |
操作名 |
操作描述 |
PUT Bucket |
创建存储桶 |
在指定账号下创建一个存储桶 |
DELETE Bucket |
删除存储桶 |
删除指定账号下的空存储桶 |
访问控制列表
API |
操作名 |
操作描述 |
PUT Bucket acl |
获取存储桶 ACL |
设置指定存储桶访问权限控制列表 |
GET Bucket acl |
查询存储桶 ACL |
查询存储桶的访问控制列表 |
基本操作
创建存储桶
功能说明
在指定账号下创建一个存储桶。
方法原型
cos_status_t *cos_create_bucket(const cos_request_options_t *options,
const cos_string_t *bucket,
cos_acl_e cos_acl,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
cos_acl |
允许用户自定义权限。 有效值:COS_ACL_PRIVATE(0),COS_ACL_PUBLIC_READ(1),COS_ACL_PUBLIC_READ_WRITE(2) 默认值:COS_ACL_PRIVATE(0) |
Enum |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_acl_e cos_acl = COS_ACL_PRIVATE;
cos_string_t bucket;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//创建存储桶
s = cos_create_bucket(options, &bucket, cos_acl, &resp_headers);
if (cos_status_is_ok(s)) {
printf("create bucket succeeded\n");
} else {
printf("create bucket failed\n");
}
//销毁内存池
cos_pool_destroy(p);
删除存储桶
功能说明
删除指定账号下的空存储桶。
方法原型
cos_status_t *cos_delete_bucket(const cos_request_options_t *options,
const cos_string_t *bucket,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//删除存储桶
s = cos_delete_bucket(options, &bucket, &resp_headers);
if (cos_status_is_ok(s)) {
printf("create bucket succeeded\n");
} else {
printf("create bucket failed\n");
}
//销毁内存池
cos_pool_destroy(p);
设置存储桶 ACL
功能说明
设置指定存储桶访问权限控制列表。
方法原型
cos_status_t *cos_put_bucket_acl(const cos_request_options_t *options,
const cos_string_t *bucket,
cos_acl_e cos_acl,
const cos_string_t *grant_read,
const cos_string_t *grant_write,
const cos_string_t *grant_full_ctrl,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
cos_acl |
允许用户自定义权限。 有效值:COS_ACL_PRIVATE(0),COS_ACL_PUBLIC_READ(1),COS_ACL_PUBLIC_READ_WRITE(2) 默认值:COS_ACL_PRIVATE(0) |
Enum |
grant_read |
读权限授予者 |
String |
grant_write |
写权限授予者 |
String |
grant_full_ctrl |
读写权限授予者 |
String |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//设置存储桶 ACL
cos_string_t read;
cos_str_set(&read, "id=\"qcs::cam::uin/100000000001:uin/100000000001\", id=\"qcs::cam::uin/100000000011:uin/100000000011\"");
s = cos_put_bucket_acl(options, &bucket, cos_acl, &read, NULL, NULL, &resp_headers);
if (cos_status_is_ok(s)) {
printf("put bucket acl succeeded\n");
} else {
printf("put bucket acl failed\n");
}
//销毁内存池
cos_pool_destroy(p);
查询存储桶 ACL
功能说明
查询存储桶的访问控制列表。
方法原型
cos_status_t *cos_get_bucket_acl(const cos_request_options_t *options,
const cos_string_t *bucket,
cos_acl_params_t *acl_param,
cos_table_t **resp_headers)
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
acl_param |
请求操作参数 |
Struct |
owner_id |
请求操作返回的存储桶持有者 ID |
String |
owner_name |
请求操作返回的存储桶持有者的名称 |
String |
object_list |
请求操作返回的被授权者信息与权限信息 |
Struct |
type |
请求操作返回的被授权者账户类型 |
String |
id |
请求操作返回的被授权者用户 ID |
String |
name |
请求操作返回的被授权者用户名称 |
String |
permission |
请求操作返回的被授权者权限信息 |
String |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//获取存储桶 ACL
cos_acl_params_t *acl_params = NULL;
acl_params = cos_create_acl_params(p);
s = cos_get_bucket_acl(options, &bucket, acl_params, &resp_headers);
if (cos_status_is_ok(s)) {
printf("get bucket acl succeeded\n");
printf("acl owner id:%s, name:%s\n", acl_params->owner_id.data, acl_params->owner_name.data);
cos_acl_grantee_content_t *acl_content = NULL;
cos_list_for_each_entry(cos_acl_grantee_content_t, acl_content, &acl_params->grantee_list, node) {
printf("acl grantee type:%s, id:%s, name:%s, permission:%s\n", acl_content->type.data, acl_content->id.data, acl_content->name.data, acl_content->permission.data);
}
} else {
printf("get bucket acl failed\n");
}
//销毁内存池
cos_pool_destroy(p);
对象操作
简介
本文档提供关于对象的简单操作、分块操作等其他操作相关的 API 概览以及 SDK 示例代码。
简单操作
API |
操作名 |
操作描述 |
GET Bucket(List Object) |
获取对象列表 |
查询存储桶下的部分或者全部对象 |
PUT Object |
上传对象 |
上传一个对象至存储桶 |
HEAD Object |
获取对象元数据 |
查询对象的元数据信息 |
GET Object |
下载对象 |
下载一个对象至本地 |
PUT Object - Copy |
设置对象复制 |
复制文件到目标路径 |
DELETE Object |
删除单个对象 |
在存储桶中删除指定对象 |
DELETE Multiple Objects |
删除多个对象 |
在存储桶中批量删除对象 |
分块操作
API |
操作名 |
操作描述 |
List Multipart Uploads |
查询分块上传 |
查询正在进行中的分块上传信息 |
Initiate Multipart Upload |
初始化分块上传 |
初始化分块上传任务 |
Upload Part |
上传分块 |
分块上传文件 |
List Parts |
查询已上传块 |
查询特定分块上传操作中的已上传的块 |
Complete Multipart Upload |
完成分块上传 |
完成整个文件的分块上传 |
Abort Multipart Upload |
终止分块上传 |
终止一个分块上传操作并删除已上传的块 |
其他操作
API |
操作名 |
操作描述 |
PUT Object acl |
设置对象 ACL |
设置存储桶中某个对象的访问控制列表 |
GET Object acl |
获取对象 ACL |
查询对象的访问控制列表 |
简单操作
查询对象列表
功能说明
查询存储桶下的部分或者全部对象。
方法原型
cos_status_t *cos_list_object(const cos_request_options_t *options,
const cos_string_t *bucket,
cos_list_object_params_t *params,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,Bucket 的命名规则为 BucketName-APPID ,此处填写的存储桶名称必须为此格式 |
String |
params |
列表操作参数信息 |
Struct |
encoding_type |
规定返回值的编码方式 |
String |
prefix |
前缀匹配,用来规定返回的文件前缀地址 |
String |
marker |
默认以 UTF-8 二进制顺序列出条目,所有列出条目从 marker 开始 |
String |
delimiter |
查询分隔符,用于对对象键进行分组 |
String |
max_ret |
单次返回最大的条目数量,默认1000 |
Struct |
truncated |
返回条目是否被截断,'true' 或者 'false' |
Boolean |
next_marker |
假如返回条目被截断,则返回 NextMarker 就是下一个条目的起点 |
String |
object_list |
Get Bucket 操作返回的对象信息列表 |
Struct |
key |
Get Bucket 操作返回的 Object 名称 |
Struct |
last_modified |
Get Bucket 操作返回的 Object 最后修改时间 |
Struct |
etag |
Get Bucket 操作返回的对象的 SHA-1 算法校验值 |
Struct |
size |
Get Bucket 操作返回的对象大小,单位 Byte |
Struct |
owner_id |
Get Bucket 操作返回的对象拥有者 UID 信息 |
Struct |
storage_class |
Get Bucket 操作返回的对象存储级别 |
Struct |
common_prefix_list |
将 Prefix 到 delimiter 之间的相同路径归为一类,定义为 Common Prefix |
Struct |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//获取对象列表
cos_list_object_params_t *list_params = NULL;
cos_list_object_content_t *content = NULL;
list_params = cos_create_list_object_params(p);
s = cos_list_object(options, &bucket, list_params, &resp_headers);
if (cos_status_is_ok(s)) {
printf("list object succeeded\n");
cos_list_for_each_entry(cos_list_object_content_t, content, &list_params->object_list, node) {
key = printf("%.*s\n", content->key.len, content->key.data);
}
} else {
printf("list object failed\n");
}
//销毁内存池
cos_pool_destroy(p);
简单上传对象
功能说明
上传一个对象至存储桶。
方法原型
cos_status_t *cos_put_object_from_file(const cos_request_options_t *options,
const cos_string_t *bucket,
const cos_string_t *object,
const cos_string_t *filename,
cos_table_t *headers,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
object |
Object 名称 |
String |
filename |
Object 本地保存文件名称 |
String |
headers |
CSP 请求附加头域 |
Struct |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_string_t object;
cos_string_t file;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//上传对象
cos_str_set(&file, TEST_DOWNLOAD_NAME);
cos_str_set(&object, TEST_OBJECT_NAME);
s = cos_put_object_from_file(options, &bucket, &object, &file, NULL, &resp_headers);
if (cos_status_is_ok(s)) {
printf("put object succeeded\n");
} else {
printf("put object failed\n");
}
//销毁内存池
cos_pool_destroy(p);
查询对象元数据
功能说明
查询对象的元数据信息。
方法原型
cos_status_t *cos_head_object(const cos_request_options_t *options,
const cos_string_t *bucket,
const cos_string_t *object,
cos_table_t *headers,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
object |
Object 名称 |
String |
headers |
CSP 请求附加头域 |
Struct |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_string_t object;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//获取对象元数据
cos_str_set(&object, TEST_OBJECT_NAME);
s = cos_head_object(options, &bucket, &object, NULL, &resp_headers);
if (cos_status_is_ok(s)) {
printf("head object succeeded\n");
} else {
printf("head object failed\n");
}
//销毁内存池
cos_pool_destroy(p);
下载对象
功能说明
下载一个对象至本地。该操作需要对目标对象具有读权限或该目标对象已对所有人都开放了读权限(公有读)。
方法原型
cos_status_t *cos_get_object_to_file(const cos_request_options_t *options,
const cos_string_t *bucket,
const cos_string_t *object,
cos_table_t *headers,
cos_table_t *params,
cos_string_t *filename,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
object |
Object 名称 |
String |
headers |
CSP 请求附加头域 |
Struct |
params |
CSP 请求操作参数 |
Struct |
filename |
Object 本地保存文件名称 |
String |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_string_t object;
cos_string_t file;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//获取对象
cos_str_set(&file, TEST_DOWNLOAD_NAME);
cos_str_set(&object, TEST_OBJECT_NAME);
s = cos_get_object_to_file(options, &bucket, &object, NULL, NULL, &file, &resp_headers);
if (cos_status_is_ok(s)) {
printf("get object succeeded\n");
} else {
printf("get object failed\n");
}
//销毁内存池
cos_pool_destroy(p);
设置对象复制
功能说明
复制文件到目标路径。
方法原型
cos_status_t *cos_copy_object(const cos_request_options_t *options,
const cos_string_t *copy_source,
const cos_string_t *dest_bucket,
const cos_string_t *dest_object,
cos_table_t *headers,
cos_copy_object_params_t *copy_object_param,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
copy_source |
源文件路径 |
String |
dest_bucket |
目的存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
dest_object |
目的 Object 名称 |
String |
headers |
CSP 请求附加头域 |
Struct |
copy_object_param |
Put Object Copy 操作参数 |
Struct |
etag |
返回文件的 MD5 算法校验值 |
String |
last_modify |
返回文件最后修改时间,GMT 格式 |
String |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_string_t object;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//设置对象复制
cos_str_set(&object, TEST_OBJECT_NAME);
cos_string_t copy_source;
cos_str_set(©_source, TEST_COPY_SRC);
cos_copy_object_params_t *params = NULL;
params = cos_create_copy_object_params(p);
s = cos_copy_object(options, ©_source, &bucket, &object, NULL, params, &resp_headers);
if (cos_status_is_ok(s)) {
printf("put object copy succeeded\n");
} else {
printf("put object copy failed\n");
}
//销毁内存池
cos_pool_destroy(p);
删除单个对象
功能说明
在存储桶中删除指定对象。
方法原型
cos_status_t *cos_delete_object(const cos_request_options_t *options,
const cos_string_t *bucket,
const cos_string_t *object,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
object |
Object 名称 |
String |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_string_t object;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//删除单个对象
cos_str_set(&object, TEST_OBJECT_NAME);
s = cos_delete_object(options, &bucket, &object, &resp_headers);
if (cos_status_is_ok(s)) {
printf("delete object succeeded\n");
} else {
printf("delete object failed\n");
}
//销毁内存池
cos_pool_destroy(p);
删除多个对象
功能说明
在存储桶中批量删除对象,最大支持单次删除1000个对象。对于返回结果,CSP 提供 Verbose 和 Quiet 两种结果模式。Verbose 模式将返回每个 Object 的删除结果。Quiet 模式只返回报错的 Object 信息。
方法原型
cos_status_t *cos_delete_objects(const cos_request_options_t *options,
const cos_string_t *bucket,
cos_list_t *object_list,
int is_quiet,
cos_table_t **resp_headers,
cos_list_t *deleted_object_list);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
object_list |
Object 待删除列表 |
Struct |
key |
待删除 Object 名称 |
String |
is_quiet |
决定是否启动 Quiet 模式 True(1):启动 Quiet 模式,False(0):启动 Verbose 模式。默认为 False(0) |
Boolean |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
deleted_object_list |
Object 删除信息列表 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_string_t object;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//设置批量删除对象
char *object_name1 = TEST_OBJECT_NAME1;
char *object_name2 = TEST_OBJECT_NAME2;
cos_object_key_t *content1 = NULL;
cos_object_key_t *content2 = NULL;
cos_list_t object_list;
cos_list_t deleted_object_list;
cos_list_init(&object_list);
cos_list_init(&deleted_object_list);
content1 = cos_create_cos_object_key(p);
cos_str_set(&content1->key, object_name1);
cos_list_add_tail(&content1->node, &object_list);
content2 = cos_create_cos_object_key(p);
cos_str_set(&content2->key, object_name2);
cos_list_add_tail(&content2->node, &object_list);
//批量删除对象
int is_quiet = COS_TRUE;
cos_str_set(&object, TEST_OBJECT_NAME);
s = cos_delete_objects(options, &bucket, &object_list, is_quiet, &resp_headers, &deleted_object_list);
if (cos_status_is_ok(s)) {
printf("delete objects succeeded\n");
} else {
printf("delete objects failed\n");
}
//销毁内存池
cos_pool_destroy(p);
分块操作
查询分块上传
功能说明
查询正在进行中的分块上传信息。单次最多列出1000个正在进行中的分块上传。
方法原型
cos_status_t *cos_list_multipart_upload(const cos_request_options_t *options,
const cos_string_t *bucket,
cos_list_multipart_upload_params_t *params,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
params |
List Multipart Uploads 操作参数 |
Struct |
encoding_type |
规定返回值的编码方式 |
String |
prefix |
前缀匹配,用来规定返回的文件前缀地址 |
String |
upload_id_marker |
假如返回条目被截断,则返回 NextMarker 就是下一个条目的起点 |
String |
delimiter |
定界符为一个符号。 如果有 Prefix,则将 Prefix 到 delimiter 之间的相同路径归为一类,定义为 Common Prefix,然后列出所有 Common Prefix。 如果没有 Prefix,则从路径起点开始 |
String |
max_ret |
单次返回最大的条目数量,默认1000 |
String |
key_marker |
与 upload-id-marker 一起使用。 当 upload-id-marker 未被指定时,ObjectName 字母顺序大于 key-marker 的条目将被列出。 当 upload-id-marker 被指定时,ObjectName 字母顺序大于 key-marker 的条目被列出,ObjectName 字母顺序等于 key-marker 同时 UploadID 大于 upload-id-marker 的条目将被列出 |
String |
upload_id_marker |
与 key-marker 一起使用。 当 key-marker 未被指定时,upload-id-marker 将被忽略。 当 key-marker 被指定时,ObjectName 字母顺序大于 key-marker 的条目被列出,ObjectName 字母顺序等于 key-marker 同时 UploadID 大于 upload-id-marker 的条目将被列出 |
String |
truncated |
返回条目是否被截断,'true' 或者 'false' |
Boolean |
next_key_marker |
假如返回条目被截断,则返回 NextMarker 就是下一个条目的起点 |
String |
next_upload_id_marker |
假如返回条目被截断,则返回 NextMarker 就是下一个条目的起点 |
String |
upload_list |
分块上传的信息 |
Struct |
key |
Object 的名称 |
String |
upload_id |
标示本次分块上传的 ID |
String |
initiated |
标示本次分块上传任务的启动时间 |
String |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
typedef struct {
cos_list_t node;
cos_string_t key;
cos_string_t upload_id;
cos_string_t initiated;
} cos_list_multipart_upload_content_t;
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
cos_string_t bucket;
int is_cname = 0;
cos_table_t *resp_headers = NULL;
cos_request_options_t *options = NULL;
cos_status_t *s = NULL;
cos_list_multipart_upload_params_t *list_multipart_params = NULL;
//创建内存池 & 初始化请求选项
cos_pool_create(&p, NULL);
options = cos_request_options_create(p);
init_test_request_options(options, is_cname);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//查询分块上传
list_multipart_params = cos_create_list_multipart_upload_params(p);
list_multipart_params->max_ret = 999;
s = cos_list_multipart_upload(options, &bucket, list_multipart_params, &resp_headers);
log_status(s);
//销毁内存池
cos_pool_destroy(p);
初始化分块上传
功能说明
Initiate Multipart Upload 请求实现初始化分片上传,成功执行此请求以后会返回 Upload ID 用于后续的 Upload Part 请求。
方法原型
cos_status_t *cos_init_multipart_upload(const cos_request_options_t *options,
const cos_string_t *bucket,
const cos_string_t *object,
cos_string_t *upload_id,
cos_table_t *headers,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
object |
Object 名称 |
String |
upload_id |
操作返回的 Upload ID |
String |
headers |
CSP 请求附加头域 |
Struct |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_string_t object;
cos_string_t file;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//初始化分块上传
cos_str_set(&object, TEST_OBJECT_NAME);
s = cos_init_multipart_upload(options, &bucket, &object,
&upload_id, headers, &resp_headers);
if (cos_status_is_ok(s)) {
printf("init multipart upload succeeded\n");
} else {
printf("init multipart upload failed\n");
}
//销毁内存池
cos_pool_destroy(p);
查询已上传块
功能说明
查询特定分块上传操作中的已上传的块。
方法原型
cos_status_t *cos_list_upload_part(const cos_request_options_t *options,
const cos_string_t *bucket,
const cos_string_t *object,
const cos_string_t *upload_id,
cos_list_upload_part_params_t *params,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
object |
Object 名称 |
String |
upload_id |
上传任务编号 |
String |
params |
List Parts 操作参数 |
Struct |
part_number_marker |
默认以 UTF-8 二进制顺序列出条目,所有列出条目从 marker 开始 |
String |
encoding_type |
规定返回值的编码方式 |
String |
max_ret |
单次返回最大的条目数量,默认1000 |
String |
truncated |
返回条目是否被截断,'true' 或者 'false' |
Boolean |
next_part_number_marker |
假如返回条目被截断,则返回 NextMarker 就是下一个条目的起点 |
String |
part_list |
完成分块的信息 |
Struct |
part_number |
分块编号 |
String |
size |
分块大小,单位 Byte |
String |
etag |
分块的 SHA-1 算法校验值 |
String |
last_modified |
分块最后修改时间 |
String |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_string_t object;
cos_string_t file;
cos_table_t *resp_headers = NULL;
cos_list_part_content_t *part_content = NULL;
cos_complete_part_content_t *complete_part_content = NULL;
int part_num = 1;
int64_t pos = 0;
int64_t file_length = 0;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//查询已上传块
params = cos_create_list_upload_part_params(p);
params->max_ret = 1000;
cos_list_init(&complete_part_list);
s = cos_list_upload_part(options, &bucket, &object, &upload_id,
params, &resp_headers);
if (cos_status_is_ok(s)) {
printf("List multipart succeeded\n");
} else {
printf("List multipart failed\n");
cos_pool_destroy(p);
return;
}
cos_list_for_each_entry(cos_list_part_content_t, part_content, ¶ms->part_list, node) {
complete_part_content = cos_create_complete_part_content(p);
cos_str_set(&complete_part_content->part_number, part_content->part_number.data);
cos_str_set(&complete_part_content->etag, part_content->etag.data);
cos_list_add_tail(&complete_part_content->node, &complete_part_list);
}
//完成分块上传
s = cos_complete_multipart_upload(options, &bucket, &object, &upload_id,
&complete_part_list, complete_headers, &resp_headers);
if (cos_status_is_ok(s)) {
printf("Complete multipart upload from file succeeded, upload_id:%.*s\n",
upload_id.len, upload_id.data);
} else {
printf("Complete multipart upload from file failed\n");
}
//销毁内存池
cos_pool_destroy(p);
上传分块
功能说明
分块上传文件。Upload Part 请求实现在初始化以后的分块上传,支持的块的数量为1到10000,块的大小为1MB到5GB。在每次请求 Upload Part 时,需要携带 partNumber 和 uploadID,partNumber 为块的编号,支持乱序上传。
方法原型
cos_status_t *cos_upload_part_from_file(const cos_request_options_t *options,
const cos_string_t *bucket,
const cos_string_t *object,
const cos_string_t *upload_id,
int part_num,
cos_upload_file_t *upload_file,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
object |
Object 名称 |
String |
upload_id |
上传任务编号 |
String |
part_num |
分块编号 |
Int |
upload_file |
待上传本地文件信息 |
Struct |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_string_t object;
cos_string_t file;
cos_table_t *resp_headers = NULL;
int part_num = 1;
int64_t pos = 0;
int64_t file_length = 0;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//上传分块
int res = COSE_OK;
cos_upload_file_t *upload_file = NULL;
cos_file_buf_t *fb = cos_create_file_buf(p);
res = cos_open_file_for_all_read(p, TEST_MULTIPART_FILE, fb);
if (res != COSE_OK) {
cos_error_log("Open read file fail, filename:%s\n", TEST_MULTIPART_FILE);
return;
}
file_length = fb->file_last;
apr_file_close(fb->file);
while(pos < file_length) {
upload_file = cos_create_upload_file(p);
cos_str_set(&upload_file->filename, TEST_MULTIPART_FILE);
upload_file->file_pos = pos;
pos += 2 * 1024 * 1024;
upload_file->file_last = pos < file_length ? pos : file_length; //2MB
s = cos_upload_part_from_file(options, &bucket, &object, &upload_id,
part_num++, upload_file, &resp_headers);
if (cos_status_is_ok(s)) {
printf("upload part succeeded\n");
} else {
printf("upload part failed\n");
}
}
//销毁内存池
cos_pool_destroy(p);
复制分块
功能说明
将其他对象复制为一个分块。
方法原型
cos_status_t *cos_upload_part_copy(const cos_request_options_t *options,
cos_upload_part_copy_params_t *params,
cos_table_t *headers,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
params |
复制分块参数信息 |
Struct |
copy_source |
源文件路径 |
String |
dest_bucket |
目的 存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
dest_object |
目的 Object 名称 |
String |
upload_id |
上传任务编号 |
String |
part_num |
分块编号 |
Int |
range_start |
源文件起始偏移 |
Int |
range_end |
源文件终止偏移 |
Int |
rsp_content |
复制分块结果信息 |
Struct |
etag |
返回文件的 MD5 算法校验值 |
String |
last_modify |
返回文件最后修改时间,GMT 格式 |
String |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_string_t object;
cos_string_t file;
int is_cname = 0;
cos_string_t upload_id;
cos_list_upload_part_params_t *list_upload_part_params = NULL;
cos_upload_part_copy_params_t *upload_part_copy_params1 = NULL;
cos_upload_part_copy_params_t *upload_part_copy_params2 = NULL;
cos_table_t *headers = NULL;
cos_table_t *query_params = NULL;
cos_table_t *resp_headers = NULL;
cos_table_t *list_part_resp_headers = NULL;
cos_list_t complete_part_list;
cos_list_part_content_t *part_content = NULL;
cos_complete_part_content_t *complete_content = NULL;
cos_table_t *complete_resp_headers = NULL;
cos_status_t *s = NULL;
int part1 = 1;
int part2 = 2;
char *local_filename = "test_upload_part_copy.file";
char *download_filename = "test_upload_part_copy.file.download";
char *source_object_name = "cos_test_upload_part_copy_source_object";
char *dest_object_name = "cos_test_upload_part_copy_dest_object";
FILE *fd = NULL;
cos_string_t download_file;
cos_string_t dest_bucket;
cos_string_t dest_object;
int64_t range_start1 = 0;
int64_t range_end1 = 6000000;
int64_t range_start2 = 6000001;
int64_t range_end2;
cos_string_t data;
cos_pool_create(&p, NULL);
options = cos_request_options_create(p);
//创建一个10MB本地随机文件
make_rand_string(p, 10 * 1024 * 1024, &data);
fd = fopen(local_filename, "w");
fwrite(data.data, sizeof(data.data[0]), data.len, fd);
fclose(fd);
//使用本地文件上传对象
init_test_request_options(options, is_cname);
cos_str_set(&bucket, "source-1253666666");
cos_str_set(&object, "cos_test_upload_part_copy_source_object");
cos_str_set(&file, local_filename);
s = cos_put_object_from_file(options, &bucket, &object, &file, NULL, &resp_headers);
log_status(s);
//初始化分块上传
cos_str_set(&object, dest_object_name);
s = cos_init_multipart_upload(options, &bucket, &object,
&upload_id, NULL, &resp_headers);
log_status(s);
//使用已上传对象复制分块1
upload_part_copy_params1 = cos_create_upload_part_copy_params(p);
cos_str_set(&upload_part_copy_params1->copy_source, "mybucket-1253666666.cn-south.myqcloud.com/cos_test_upload_part_copy_source_object");
cos_str_set(&upload_part_copy_params1->dest_bucket, TEST_BUCKET_NAME);
cos_str_set(&upload_part_copy_params1->dest_object, dest_object_name);
cos_str_set(&upload_part_copy_params1->upload_id, upload_id.data);
upload_part_copy_params1->part_num = part1;
upload_part_copy_params1->range_start = range_start1;
upload_part_copy_params1->range_end = range_end1;
headers = cos_table_make(p, 0);
s = cos_upload_part_copy(options, upload_part_copy_params1, headers, &resp_headers);
log_status(s);
printf("last modified:%s, etag:%s\n", upload_part_copy_params1->rsp_content->last_modify.data, upload_part_copy_params1->rsp_content->etag.data);
//使用已上传对象复制分块2
resp_headers = NULL;
range_end2 = get_file_size(local_filename) - 1;
upload_part_copy_params2 = cos_create_upload_part_copy_params(p);
cos_str_set(&upload_part_copy_params2->copy_source, "mybucket-1253666666.cn-south.myqcloud.com/cos_test_upload_part_copy_source_object");
cos_str_set(&upload_part_copy_params2->dest_bucket, TEST_BUCKET_NAME);
cos_str_set(&upload_part_copy_params2->dest_object, dest_object_name);
cos_str_set(&upload_part_copy_params2->upload_id, upload_id.data);
upload_part_copy_params2->part_num = part2;
upload_part_copy_params2->range_start = range_start2;
upload_part_copy_params2->range_end = range_end2;
headers = cos_table_make(p, 0);
s = cos_upload_part_copy(options, upload_part_copy_params2, headers, &resp_headers);
log_status(s);
printf("last modified:%s, etag:%s\n", upload_part_copy_params1->rsp_content->last_modify.data, upload_part_copy_params1->rsp_content->etag.data);
//列出已上传对象
list_upload_part_params = cos_create_list_upload_part_params(p);
list_upload_part_params->max_ret = 10;
cos_list_init(&complete_part_list);
cos_str_set(&dest_bucket, TEST_BUCKET_NAME);
cos_str_set(&dest_object, dest_object_name);
s = cos_list_upload_part(options, &dest_bucket, &dest_object, &upload_id,
list_upload_part_params, &list_part_resp_headers);
log_status(s);
cos_list_for_each_entry(cos_list_part_content_t, part_content, &list_upload_part_params->part_list, node) {
complete_content = cos_create_complete_part_content(p);
cos_str_set(&complete_content->part_number, part_content->part_number.data);
cos_str_set(&complete_content->etag, part_content->etag.data);
cos_list_add_tail(&complete_content->node, &complete_part_list);
}
//完成分块上传
headers = cos_table_make(p, 0);
s = cos_complete_multipart_upload(options, &dest_bucket, &dest_object,
&upload_id, &complete_part_list, headers, &complete_resp_headers);
log_status(s);
//对比复制分块上传生成的对象和本地文件是否匹配
headers = cos_table_make(p, 0);
cos_str_set(&download_file, download_filename);
s = cos_get_object_to_file(options, &dest_bucket, &dest_object, headers,
query_params, &download_file, &resp_headers);
log_status(s);
printf("local file len = %"APR_INT64_T_FMT", download file len = %"APR_INT64_T_FMT, get_file_size(local_filename), get_file_size(download_filename));
remove(download_filename);
remove(local_filename);
//销毁内存池
cos_pool_destroy(p);
完成分块上传
功能说明
完成整个文件的分块上传。当您已经使用 Upload Parts 上传所有块以后,您可以用该 API 完成上传。在使用该 API 时,您必须在 Body 中给出每一个块的 PartNumber 和 ETag,用来校验块的准确性。
方法原型
cos_status_t *cos_complete_multipart_upload(const cos_request_options_t *options,
const cos_string_t *bucket,
const cos_string_t *object,
const cos_string_t *upload_id,
cos_list_t *part_list,
cos_table_t *headers,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
object |
Object 名称 |
String |
upload_id |
上传任务编号 |
String |
part_list |
完成分块上传的参数 |
Struct |
part_number |
分块编号 |
String |
etag |
分块的 ETag 值,为 sha1 校验值,需要在校验值前后加上双引号,如 "3a0f1fd698c235af9cf098cb74aa25bc" |
String |
headers |
CSP 请求附加头域 |
Struct |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_string_t object;
cos_string_t file;
cos_table_t *resp_headers = NULL;
cos_list_part_content_t *part_content = NULL;
cos_complete_part_content_t *complete_part_content = NULL;
int part_num = 1;
int64_t pos = 0;
int64_t file_length = 0;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//查询已上传分块
params = cos_create_list_upload_part_params(p);
params->max_ret = 1000;
cos_list_init(&complete_part_list);
s = cos_list_upload_part(options, &bucket, &object, &upload_id,
params, &resp_headers);
if (cos_status_is_ok(s)) {
printf("List multipart succeeded\n");
} else {
printf("List multipart failed\n");
cos_pool_destroy(p);
return;
}
cos_list_for_each_entry(cos_list_part_content_t, part_content, ¶ms->part_list, node) {
complete_part_content = cos_create_complete_part_content(p);
cos_str_set(&complete_part_content->part_number, part_content->part_number.data);
cos_str_set(&complete_part_content->etag, part_content->etag.data);
cos_list_add_tail(&complete_part_content->node, &complete_part_list);
}
//完成分块上传
s = cos_complete_multipart_upload(options, &bucket, &object, &upload_id,
&complete_part_list, complete_headers, &resp_headers);
if (cos_status_is_ok(s)) {
printf("Complete multipart upload from file succeeded, upload_id:%.*s\n",
upload_id.len, upload_id.data);
} else {
printf("Complete multipart upload from file failed\n");
}
//销毁内存池
cos_pool_destroy(p);
终止分块上传
功能说明
终止一个分块上传操作并删除已上传的块。当您调用 Abort Multipart Upload 时,如果有正在使用这个 Upload Parts 上传块的请求,则 Upload Parts 会返回失败。
方法原型
cos_status_t *cos_abort_multipart_upload(const cos_request_options_t *options,
const cos_string_t *bucket,
const cos_string_t *object,
cos_string_t *upload_id,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
object |
Object 名称 |
String |
upload_id |
上传任务编号 |
String |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
cos_string_t bucket;
cos_string_t object;
int is_cname = 0;
cos_table_t *headers = NULL;
cos_table_t *resp_headers = NULL;
cos_request_options_t *options = NULL;
cos_string_t upload_id;
cos_status_t *s = NULL;
//创建内存池 & 初始化请求选项
cos_pool_create(&p, NULL);
options = cos_request_options_create(p);
init_test_request_options(options, is_cname);
headers = cos_table_make(p, 1);
cos_str_set(&bucket, TEST_BUCKET_NAME);
cos_str_set(&object, TEST_MULTIPART_OBJECT);
//初始化分块上传
s = cos_init_multipart_upload(options, &bucket, &object,
&upload_id, headers, &resp_headers);
if (cos_status_is_ok(s)) {
printf("Init multipart upload succeeded, upload_id:%.*s\n",
upload_id.len, upload_id.data);
} else {
printf("Init multipart upload failed\n");
cos_pool_destroy(p);
return;
}
//终止分块上传
s = cos_abort_multipart_upload(options, &bucket, &object, &upload_id,
&resp_headers);
if (cos_status_is_ok(s)) {
printf("Abort multipart upload succeeded, upload_id::%.*s\n",
upload_id.len, upload_id.data);
} else {
printf("Abort multipart upload failed\n");
}
//销毁内存池
cos_pool_destroy(p);
其他操作
设置对象 ACL
功能说明
设置存储桶中某个对象的访问控制列表。
方法原型
cos_status_t *cos_put_object_acl(const cos_request_options_t *options,
const cos_string_t *bucket,
const cos_string_t *object,
cos_acl_e cos_acl,
const cos_string_t *grant_read,
const cos_string_t *grant_write,
const cos_string_t *grant_full_ctrl,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
object |
Object 名称 |
String |
cos_acl |
允许用户自定义权限。有效值:COS_ACL_PRIVATE(0),COS_ACL_PUBLIC_READ(1) 默认值:COS_ACL_PRIVATE(0) |
Enum |
grant_read |
读权限授予者 |
String |
grant_write |
写权限授予者 |
String |
grant_full_ctrl |
读写权限授予者 |
String |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_string_t object;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//设置对象 ACL
cos_str_set(&object, TEST_OBJECT_NAME);
cos_string_t read;
cos_str_set(&read, "id=\"qcs::cam::uin/12345:uin/12345\", id=\"qcs::cam::uin/45678:uin/45678\"");
s = cos_put_object_acl(options, &bucket, &object, cos_acl, &read, NULL, NULL, &resp_headers);
if (cos_status_is_ok(s)) {
printf("put object acl succeeded\n");
} else {
printf("put object acl failed\n");
}
//销毁内存池
cos_pool_destroy(p);
查询对象 ACL
功能说明
查询对象的访问控制列表。
方法原型
cos_status_t *cos_get_object_acl(const cos_request_options_t *options,
const cos_string_t *bucket,
const cos_string_t *object,
cos_acl_params_t *acl_param,
cos_table_t **resp_headers)
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
object |
Object 名称 |
String |
acl_param |
请求操作参数 |
Struct |
owner_id |
请求操作返回的 Bucket 持有者 ID |
String |
owner_name |
请求操作返回的 Bucket 持有者的名称 |
String |
object_list |
请求操作返回的被授权者信息与权限信息 |
Struct |
type |
请求操作返回的被授权者账户类型 |
String |
id |
请求操作返回的被授权者用户 ID |
String |
name |
请求操作返回的被授权者用户名称 |
String |
permission |
请求操作返回的被授权者权限信息 |
String |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_string_t object;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//获取对象 ACL
cos_acl_params_t *acl_params2 = NULL;
acl_params2 = cos_create_acl_params(p);
s = cos_get_object_acl(options, &bucket, &object, acl_params2, &resp_headers);
if (cos_status_is_ok(s)) {
printf("get object acl succeeded\n");
printf("acl owner id:%s, name:%s\n", acl_params2->owner_id.data, acl_params2->owner_name.data);
acl_content = NULL;
cos_list_for_each_entry(cos_acl_grantee_content_t, acl_content, &acl_params2->grantee_list, node) {
printf("acl grantee id:%s, name:%s, permission:%s\n", acl_content->id.data, acl_content->name.data, acl_content->permission.data);
}
} else {
printf("get object acl failed\n");
}
//销毁内存池
cos_pool_destroy(p);
存储桶管理
简介
本文档提供关于跨域访问、生命周期、版本控制、跨地域复制相关的 API 概览以及 SDK 示例代码。
跨域访问
API |
操作名 |
操作描述 |
PUT Bucket cors |
设置跨域配置 |
设置存储桶的跨域访问权限 |
GET Bucket cors |
获取跨域配置 |
查询存储桶的跨域访问配置信息 |
DELETE Bucket cors |
删除跨域配置 |
删除存储桶的跨域访问配置信息 |
跨域访问
设置跨域配置
功能说明
设置存储桶的跨域访问权限。
方法原型
cos_status_t *cos_put_bucket_cors(const cos_request_options_t *options,
const cos_string_t *bucket,
cos_list_t *cors_rule_list,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID ,此处填写的存储桶名称必须为此格式 |
String |
cors_rule_list |
存储桶跨域配置信息 |
Struct |
id |
配置规则 ID |
String |
allowed_origin |
允许的访问来源,支持通配符* |
String |
allowed_method |
允许的 HTTP 操作,枚举值:GET,PUT,HEAD,POST,DELETE |
String |
allowed_header |
在发送 OPTIONS 请求时告知服务端,接下来的请求可以使用哪些自定义的 HTTP 请求头部,支持通配符* |
String |
expose_header |
设置浏览器可以接收到的来自服务器端的自定义头部信息 |
String |
max_age_seconds |
设置 OPTIONS 请求得到结果的有效期 |
Int |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//设置跨域配置信息
cos_list_t rule_list;
cos_list_init(&rule_list);
cos_cors_rule_content_t *rule_content = NULL;
rule_content = cos_create_cors_rule_content(p);
cos_str_set(&rule_content->id, "testrule1");
cos_str_set(&rule_content->allowed_origin, "http://www.qq1.com");
cos_str_set(&rule_content->allowed_method, "GET");
cos_str_set(&rule_content->allowed_header, "*");
cos_str_set(&rule_content->expose_header, "xxx");
rule_content->max_age_seconds = 3600;
cos_list_add_tail(&rule_content->node, &rule_list);
rule_content = cos_create_cors_rule_content(p);
cos_str_set(&rule_content->id, "testrule2");
cos_str_set(&rule_content->allowed_origin, "http://www.qq2.com");
cos_str_set(&rule_content->allowed_method, "GET");
cos_str_set(&rule_content->allowed_header, "*");
cos_str_set(&rule_content->expose_header, "yyy");
rule_content->max_age_seconds = 7200;
cos_list_add_tail(&rule_content->node, &rule_list);
rule_content = cos_create_cors_rule_content(p);
cos_str_set(&rule_content->id, "testrule3");
cos_str_set(&rule_content->allowed_origin, "http://www.qq3.com");
cos_str_set(&rule_content->allowed_method, "GET");
cos_str_set(&rule_content->allowed_header, "*");
cos_str_set(&rule_content->expose_header, "zzz");
rule_content->max_age_seconds = 60;
cos_list_add_tail(&rule_content->node, &rule_list);
//设置跨域配置
s = cos_put_bucket_cors(options, &bucket, &rule_list, &resp_headers);
if (cos_status_is_ok(s)) {
printf("put bucket cors succeeded\n");
} else {
printf("put bucket cors failed\n");
}
//销毁内存池
cos_pool_destroy(p);
查询跨域配置
功能说明
查询存储桶的跨域访问配置信息。
方法原型
cos_status_t *cos_get_bucket_cors(const cos_request_options_t *options,
const cos_string_t *bucket,
cos_list_t *cors_rule_list,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式 |
String |
cors_rule_list |
存储桶跨域配置信息 |
Struct |
id |
配置规则 ID |
String |
allowed_origin |
允许的访问来源,支持通配符* |
String |
allowed_method |
允许的 HTTP 操作,枚举值:GET,PUT,HEAD,POST,DELETE |
String |
allowed_header |
在发送 OPTIONS 请求时告知服务端,接下来的请求可以使用哪些自定义的 HTTP 请求头部,支持通配符* |
String |
expose_header |
设置浏览器可以接收到的来自服务器端的自定义头部信息 |
String |
max_age_seconds |
设置 OPTIONS 请求得到结果的有效期 |
Int |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//获取跨域配置
cos_list_t rule_list_ret;
cos_list_init(&rule_list_ret);
s = cos_get_bucket_cors(options, &bucket, &rule_list_ret, &resp_headers);
if (cos_status_is_ok(s)) {
printf("get bucket cors succeeded\n");
cos_cors_rule_content_t *content = NULL;
cos_list_for_each_entry(cos_cors_rule_content_t, content, &rule_list_ret, node) {
printf("cors id:%s, allowed_origin:%s, allowed_method:%s, allowed_header:%s, expose_header:%s, max_age_seconds:%d\n",
content->id.data, content->allowed_origin.data, content->allowed_method.data, content->allowed_header.data, content->expose_header.data, content->max_age_seconds);
}
} else {
printf("get bucket cors failed\n");
}
//销毁内存池
cos_pool_destroy(p);
删除跨域配置
功能说明
删除存储桶的跨域访问配置信息。
方法原型
cos_status_t *cos_delete_bucket_cors(const cos_request_options_t *options,
const cos_string_t *bucket,
cos_table_t **resp_headers);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID ,此处填写的存储桶名称必须为此格式 |
String |
resp_headers |
返回 HTTP 响应消息的头域 |
Struct |
返回结果说明
返回结果 |
描述 |
类型 |
code |
错误码 |
Int |
error_code |
错误码内容 |
String |
error_msg |
错误码描述 |
String |
req_id |
请求消息 ID |
String |
示例
cos_pool_t *p = NULL;
int is_cname = 0;
cos_status_t *s = NULL;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_table_t *resp_headers = NULL;
//创建内存池
cos_pool_create(&p, NULL);
//初始化请求选项
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
//删除跨域配置
s = cos_delete_bucket_cors(options, &bucket, &resp_headers);
if (cos_status_is_ok(s)) {
printf("delete bucket cors succeeded\n");
} else {
printf("delete bucket cors failed\n");
}
//销毁内存池
cos_pool_destroy(p);
预签名 URL
简介
C SDK 提供获取请求预签名 URL 接口,详细操作请查看本文说明和示例。
获取请求预签名 URL
生成请求预签名URL
功能说明
该接口用于生成请求预签名 URL。
方法原型
int cos_gen_presigned_url(const cos_request_options_t *options,
const cos_string_t *bucket,
const cos_string_t *object,
const int64_t expire,
http_method_e method,
cos_string_t *presigned_url);
参数说明
参数名称 |
参数描述 |
类型 |
options |
CSP 请求选项 |
Struct |
bucket |
存储桶名称,存储桶的命名格式为 BucketName-APPID ,此处填写的存储桶名称必须为此格式 |
String |
object |
Object 名称 |
String |
expire |
签名有效时间,单位为秒 |
Int |
method |
HTTP 请求方法枚举类型,分别为 HTTP_GET、HTTP_HEAD、HTTP_PUT、HTTP_POST、HTTP_DELETE |
Enum |
presigned_url |
生成的请求预签名 URL |
String |
返回结果说明
预签名请求示例
可在 options 参数中设置永久密钥或临时密钥来获取预签名 URL。
cos_pool_t *p = NULL;
int is_cname = 0;
cos_request_options_t *options = NULL;
cos_string_t bucket;
cos_string_t object;
cos_string_t presigned_url;
//create memory pool
cos_pool_create(&p, NULL);
//init request options
options = cos_request_options_create(p);
options->config = cos_config_create(options->pool);
init_test_config(options->config, is_cname);
cos_str_set(&options->config->endpoint, TEST_COS_ENDPOINT);
cos_str_set(&options->config->access_key_id, TEST_ACCESS_KEY_ID);
cos_str_set(&options->config->access_key_secret, TEST_ACCESS_KEY_SECRET);
/* 可以通过设置 sts_token 来使用临时密钥,当使用临时密钥时,access_key_id 和 access_key_secret 均需要设置为对应临时密钥所配套的 SecretId 和 SecretKey */
//cos_str_set(&options->config->sts_token, "MyTokenString");
cos_str_set(&options->config->appid, TEST_APPID);
options->config->is_cname = is_cname;
options->ctl = cos_http_controller_create(options->pool, 0);
cos_str_set(&bucket, TEST_BUCKET_NAME);
cos_str_set(&object, TEST_OBJECT_NAME);
//generate presigned URL
cos_gen_presigned_url(options, &bucket, &object, 300, HTTP_GET, &presigned_url);
printf("presigned url: %s\n", presigned_url.data);
//destroy memory pool
cos_pool_destroy(p);
异常处理
简介
SDK 调用失败时,结果信息包含在 API 返回的 cos_status_t 结构中。
SDK 中使用每一个 API 的正确做法如下所示,为了简要,文档中范例不再给出具体异常的处理,仅给出 API 的使用范例。
cos_status_t *s = NULL;
s = cos_put_object_from_file(options, &bucket, &object, &file, &headers, &resp_headers);
if (!s && !cos_status_is_ok(s)) {
// 按需要进行异常场景的日志输出和处理
cos_warn_log("failed to put object from file", buf);
if (s->error_code) cos_warn_log("status->error_code: %s", s->error_code);
if (s->error_msg) cos_warn_log("status->error_msg: %s", s->error_msg);
if (s->req_id) cos_warn_log("status->req_id: %s", s->req_id);
}
客户端异常
当 cos_status_t 结构中 code 成员值小于0时,表明发生 SDK 本地客户端错误,错误码信息参考枚举 cos_error_code_e 定义。
typedef enum {
COSE_OK = 0,
COSE_OUT_MEMORY = -1000,
COSE_OVER_MEMORY = -999,
COSE_FAILED_CONNECT = -998,
COSE_ABORT_CALLBACK = -997,
COSE_INTERNAL_ERROR = -996,
COSE_REQUEST_TIMEOUT = -995,
COSE_INVALID_ARGUMENT = -994,
COSE_INVALID_OPERATION = -993,
COSE_CONNECTION_FAILED = -992,
COSE_FAILED_INITIALIZE = -991,
COSE_NAME_LOOKUP_ERROR = -990,
COSE_FAILED_VERIFICATION = -989,
COSE_WRITE_BODY_ERROR = -988,
COSE_READ_BODY_ERROR = -987,
COSE_SERVICE_ERROR = -986,
COSE_OPEN_FILE_ERROR = -985,
COSE_FILE_SEEK_ERROR = -984,
COSE_FILE_INFO_ERROR = -983,
COSE_FILE_READ_ERROR = -982,
COSE_FILE_WRITE_ERROR = -981,
COSE_XML_PARSE_ERROR = -980,
COSE_UTF8_ENCODE_ERROR = -979,
COSE_CRC_INCONSISTENT_ERROR = -978,
COSE_FILE_FLUSH_ERROR = -977,
COSE_FILE_TRUNC_ERROR = -976,
COSE_UNKNOWN_ERROR = -100
} cos_error_code_e;
服务端异常
当 cos_status_t 结构中 code 成员值大于0时,表明发生网络侧错误。
以下是 cos_status_t 结构的描述:
cos_status_t 成员 |
描述 |
类型 |
code |
response 的 status 状态码, 4xx 是指请求因客户端而失败, 5xx 是服务端异常导致的失败,详情请参阅 错误码 文档 |
Int |
error_code |
请求失败时 body 返回的 Error Code,详情请参阅 错误码 文档 |
String |
error_msg |
请求失败时 body 返回的 Error Message,详情请参阅 错误码 文档 |
String |
req_id |
请求 ID,用于标识用户唯一请求 |
String |