对象存储 快速入门(C SDK)

1. 安装 CMake 工具(建议2.6.0及以上版本),单击 这里 下载,安装方式如下./configuremakemake install。

相关产品
对象存储 产品页,含版本规格、价格与购买入口。

一、相关资源

·对象存储的 XML C SDK 源码下载地址:XML C SDK。

·演示示例 Demo 下载地址:XML C SDK Demo。

·SDK 更新日志请参见 Changelog。

·SDK 常见问题请参见:C SDK 常见问题。

注意:说明:

注意:如果你在使用 SDK 时遇到函数或方法不存在等错误,请先将 SDK 升级到最新版再重试。

二、环境配置与准备

·依赖库:libcurl apr apr-util minixml。

·COS C SDK 支持以下操作系统与编译器环境:Linux、macOS、Windows。

·你需要获取一个腾讯云 API 密钥,该密钥是你使用 COS SDK 各项功能的前提。

三、安装 SDK

2. 安装 libcurl(建议7.32.0及以上版本),单击 这里 下载,安装方式如下:

./configuremakemake install

3. 安装 apr(建议1.5.2及以上版本),单击 这里 下载,安装方式如下:

./configuremakemake install

4. 安装 apr-util(建议1.5.4及以上版本),单击 这里 下载,安装时需要指定 –with-apr 选项,安装方式如下:

./configure –with-apr=/your/apr/install/pathmakemake install

5. 安装 minixml(建议2.8 – 2.12版本),单击 这里 下载,安装方式如下:

./configuremakemake install

6. 编译和安装 COS C SDK。下载 XML C SDK 源码,执行如下命令:

cmake .makemake install

7. 设置环境变量:

以 Linux 为例,apr 和 apr-util 库默认安装位置是/usr/local/apr/lib, 对应 pkgconfig 目录为/usr/local/apr/lib/pkgconfig,cos_c_sdk, curl, mxml 默认安装位置是/usr/local/lib,对应 pkgconfig 目录为/usr/local/lib/pkgconfig。

编辑~/.bashrc文件,添加以下环境变量:

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig:/usr/local/apr/lib/pkgconfigexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/local/apr/lib

运行以下命令使环境变量生效:

. ~/.bashrc

四、初始化 COS 服务

下面为你介绍使用 XML C SDK 的一般流程。

1. 初始化 SDK。

2. 设置请求选项参数。关于 APPID、SecretId、SecretKey、Bucket 等名称的含义和获取方式请参见 COS 术语信息。

·APPID 是申请腾讯云账号后,系统分配的账户标识之一。

·access_key_id 与 access_key_secret 是账号 API 密钥。

·endpoint 是 COS 访问域名信息,详情请参见 地域和访问域名 文档。例如,广州地域 endpoint 为 cos.ap-guangzhou.myqcloud.com,全球加速域名的 endpoint 为 cos.accelerate.myqcloud.com。endpoint 可以加上 http 或者 https,SDK 默认通过 http 访问 COS,如通过 https 访问广州地域的 endpoint 为 https://cos.ap-guangzhou.myqcloud.com。

·is_cname 表示 endpoint 是否为自定义域名,如果is_cname设置成1,则 endpoint 表示自定义域名。

3. 设置 API 接口必需的参数。

4. 调用 SDK API 发起请求并获得请求响应结果。

五、初始化

int main(int argc, char *argv[]){ /* 程序入口处调用 cos_http_io_initialize 方法,这个方法内部会做一些全局资源的初始化,涉及网络,内存等部分 */ if (cos_http_io_initialize(NULL, 0) != COSE_OK) { exit(1); } /* 调用 COS SDK 的接口上传或下载文件 */ /* … 用户逻辑代码,这里省略 */ /* 程序结束前,调用 cos_http_io_deinitialize 方法释放之前分配的全局资源 */ cos_http_io_deinitialize(); return 0;}

六、初始化请求选项

临时密钥(推荐)永久密钥(不推荐)说明:临时密钥生成和使用可参见 临时密钥生成及使用指引。/* 等价于 apr_pool_t,用于内存管理的内存池,实现代码在 apr 库中 */cos_pool_t *pool;cos_request_options_t *options;/* 重新创建一个新的内存池,第二个参数是 NULL,表示没有继承自其它内存池 */cos_pool_create(&pool, NULL);/* 创建并初始化 options,这个参数内部主要包括 endpoint,access_key_id,acces_key_secret,is_cname, curl 参数等全局配置信息 * options的内存是由 pool 分配的,后续释放掉 pool 后,options 的内存也相当于释放掉了,不再需要单独释放内存 */ options = cos_request_options_create(pool);options->config = cos_config_create(options->pool);/* cos_str_set 是用 char* 类型的字符串初始化 cos_string_t 类型*/cos_str_set(&options->config->endpoint, "<用户的Endpoint>"); //Endpoint 依据用户所在地域的 COS 服务域名填写cos_str_set(&options->config->access_key_id, "<用户的SecretId>"); //临时密钥的 SecretId,临时密钥生成和使用指引参见https://cloud.tencent.com/document/product/436/14048cos_str_set(&options->config->access_key_secret, "<用户的SecretKey>"); //临时密钥的 SecretKey,临时密钥生成和使用指引参见https://cloud.tencent.com/document/product/436/14048cos_str_set(&options->config->sts_token, "<用户的StsToken>"); //临时密钥的 Token,临时密钥生成和使用指引参见https://cloud.tencent.com/document/product/436/14048cos_str_set(&options->config->appid, "<用户的AppId>"); //用户注册 COS 服务后所获得的 AppId/* 是否使用了 CNAME */options->config->is_cname = 0;/* 使用自定义域名访问 COS *//*options->config->is_cname = 1;cos_str_set(&options->config->endpoint, "<自定义域名>");*//* 用于设置网络相关参数,例如超时时间等*/options->ctl = cos_http_controller_create(options->pool, 0);/* 用于设置上传请求是否自动添加 Content-MD5 头部,enable 为 COS_FALSE 时上传请求将不自动添加 Content-MD5 头部,enable 为 COS_TRUE 时上传请求将自动添加 Content-MD5 头部,如果不设置此项则默认将添加 Content-MD5 头部 */cos_set_content_md5_enable(options->ctl, COS_FALSE);/* 用于设置请求路由地址和端口,一般情况下无需设置此参数,请求将按域名解析结果路由 *///cos_set_request_route(options->ctl, "192.168.12.34", 80);/* 等价于 apr_pool_t,用于内存管理的内存池,实现代码在 apr 库中 */cos_pool_t *pool;cos_request_options_t *options;/* 重新创建一个新的内存池,第二个参数是 NULL,表示没有继承自其它内存池 */cos_pool_create(&pool, NULL);/* 创建并初始化 options,这个参数内部主要包括 endpoint,access_key_id,acces_key_secret,is_cname, curl 参数等全局配置信息 * options 的内存是由 pool 分配的,后续释放掉 pool 后,options 的内存也相当于释放掉了,不再需要单独释放内存 */ options = cos_request_options_create(pool);options->config = cos_config_create(options->pool);/* cos_str_set 是用 char* 类型的字符串初始化 cos_string_t 类型*/cos_str_set(&options->config->endpoint, "<用户的Endpoint>"); //Endpoint 依据用户所在地域的 COS 服务域名填写cos_str_set(&options->config->access_key_id, "<用户的SecretId>"); //用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140cos_str_set(&options->config->access_key_secret, "<用户的SecretKey>"); //用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140cos_str_set(&options->config->appid, "<用户的AppId>"); //用户注册 COS 服务后所获得的 AppId/* 是否使用了 CNAME */options->config->is_cname = 0;/* 使用自定义域名访问 COS *//*options->config->is_cname = 1;cos_str_set(&options->config->endpoint, "<自定义域名>");*//* 用于设置网络相关参数,例如超时时间等*/options->ctl = cos_http_controller_create(options->pool, 0);/* 用于设置上传请求是否自动添加 Content-MD5 头部,enable 为 COS_FALSE 时上传请求将不自动添加 Content-MD5 头部,enable 为 COS_TRUE 时上传请求将自动添加 Content-MD5 头部,如果不设置此项则默认将添加 Content-MD5 头部 */cos_set_content_md5_enable(options->ctl, COS_FALSE);/* 用于设置请求路由地址和端口,一般情况下无需设置此参数,请求将按域名解析结果路由 *///cos_set_request_route(options->ctl, "192.168.12.34", 80);

七、访问 COS 服务

创建存储桶查询存储桶列表查询对象列表上传对象下载对象删除对象完整示例代码请参见:put_bucket_demo.c// put_bucket_demo.c#include <stdint.h>#include <stdlib.h>#include <sys/stat.h>#include <unistd.h>#include "cos_api.h"#include "cos_http_io.h"#include "cos_log.h"/** * 本样例演示了如何使用 COS C SDK 创建存储桶 */// COS 的 bucket 名称, [bucket]-[appid], 如: examplebucket-1250000000,可在 https://console.cloud.tencent.com/cos5/bucket 查看char bucket_name[] = "examplebucket-1250000000";// 开发者访问 COS 服务时拥有的用户维度唯一资源标识,用以标识资源,可在 https://console.cloud.tencent.com/cam/capi 页面获取char appid[] = "1250000000";// 开发者拥有的项目身份ID/密钥,可在 https://console.cloud.tencent.com/cam/capi 页面获取char secret_id[] = "xxxxxxxx";char secret_key[] = "xxxxxxxxxxxx";//endpoint 是 COS 访问域名信息(不设置存储桶前缀,访问 COS 时会自动在前面拼接上[bucket]-[appid]), 详情请参见 https://cloud.tencent.com/document/product/436/6224 文档char endpoint[] = "cos.ap-xxx.myqcloud.com";// 是否使用自定域名。如果设置为 COS_TRUE ,则访问 COS 时需要将 endpoint 的值修改为自定义域名int is_cname = COS_FALSE;void init_test_config(cos_config_t* config, int is_cname) { cos_str_set(&config->endpoint, endpoint); cos_str_set(&config->access_key_id, secret_id); cos_str_set(&config->access_key_secret, secret_key); cos_str_set(&config->appid, appid); // cos_str_set(&config->sts_token, token); // 使用临时密钥时的 token config->is_cname = is_cname; // 是否使用自定义域名}void init_test_request_options(cos_request_options_t* options, int is_cname) { options->config = cos_config_create(options->pool); init_test_config(options->config, is_cname); options->ctl = cos_http_controller_create(options->pool, 0);}void log_status(cos_status_t* s) { cos_warn_log("status->code: %d", s->code); 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);}void put_bucket_demo() { cos_pool_t *p = NULL; 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); init_test_request_options(options, is_cname); cos_str_set(&bucket, bucket_name); //create test bucket s = cos_create_bucket(options, &bucket, cos_acl, &resp_headers); log_status(s); cos_pool_destroy(p);}int main() { if (cos_http_io_initialize(NULL, 0) != COSE_OK) { exit(1); } // set log level, default COS_LOG_WARN cos_log_set_level(COS_LOG_ERROR); put_bucket_demo(); // cos_http_io_deinitialize last cos_http_io_deinitialize(); return 0;}完整示例代码请参见:get_bucket_list_demo.c// get_bucket_list_demo.c#include <stdint.h>#include <stdlib.h>#include <sys/stat.h>#include <unistd.h>#include "cos_api.h"#include "cos_http_io.h"#include "cos_log.h"/** * 本样例演示了如何使用 COS C SDK 获取存储桶列表 */// 开发者访问 COS 服务时拥有的用户维度唯一资源标识,用以标识资源,可在 https://console.cloud.tencent.com/cam/capi 页面获取char appid[] = "1250000000";// 开发者拥有的项目身份ID/密钥,可在 https://console.cloud.tencent.com/cam/capi 页面获取char secret_id[] = "xxxxxxxx";char secret_key[] = "xxxxxxxxxxxx";//endpoint 是 COS 访问域名信息(不设置存储桶前缀,访问 COS 时会自动在前面拼接上[bucket]-[appid]), 详情请参见 https://cloud.tencent.com/document/product/436/6224 文档char endpoint[] = "cos.ap-xxx.myqcloud.com";// 是否使用自定域名。如果设置为 COS_TRUE ,则访问 COS 时需要将 endpoint 的值修改为自定义域名int is_cname = COS_FALSE;void init_test_config(cos_config_t* config, int is_cname) { cos_str_set(&config->endpoint, endpoint); cos_str_set(&config->access_key_id, secret_id); cos_str_set(&config->access_key_secret, secret_key); cos_str_set(&config->appid, appid); // cos_str_set(&config->sts_token, token); // 使用临时密钥时的 token config->is_cname = is_cname; // 是否使用自定义域名}void init_test_request_options(cos_request_options_t* options, int is_cname) { options->config = cos_config_create(options->pool); init_test_config(options->config, is_cname); options->ctl = cos_http_controller_create(options->pool, 0);}void log_status(cos_status_t* s) { cos_warn_log("status->code: %d", s->code); 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);}void get_bucket_list_demo() { cos_pool_t *pool = NULL; cos_status_t *status = NULL; cos_request_options_t *options = NULL; cos_get_service_params_t *list_params = NULL; cos_table_t *resp_headers = NULL; //创建内存池 cos_pool_create(&pool, NULL); //初始化请求选项 options = cos_request_options_create(pool); options->config = cos_config_create(options->pool); init_test_request_options(options, is_cname); options->ctl = cos_http_controller_create(options->pool, 0); //创建get service参数, 默认获取全部bucket list_params = cos_create_get_service_params(options->pool); //若将all_region设置为0,则只根据options->config->endpoint的区域进行查询 //list_params->all_region = 0; status = cos_get_service(options, list_params, &resp_headers); log_status(status); if (!cos_status_is_ok(status)) { cos_pool_destroy(pool); return; } //查看结果 cos_get_service_content_t *content = NULL; char *line = NULL; cos_list_for_each_entry(cos_get_service_content_t, content, &list_params->bucket_list, node) { line = apr_psprintf(options->pool, "%.*s\\t%.*s\\t%.*s\\n", content->bucket_name.len, content->bucket_name.data, content->location.len, content->location.data, content->creation_date.len, content->creation_date.data); printf("%s", line); } cos_pool_destroy(pool);}int main() { if (cos_http_io_initialize(NULL, 0) != COSE_OK) { exit(1); } // set log level, default COS_LOG_WARN cos_log_set_level(COS_LOG_ERROR); get_bucket_list_demo(); // cos_http_io_deinitialize last cos_http_io_deinitialize(); return 0;}完整示例代码请参见:list_object_demo.c// list_object_demo.c#include <stdint.h>#include <stdlib.h>#include <sys/stat.h>#include <unistd.h>#include "cos_api.h"#include "cos_http_io.h"#include "cos_log.h"/** * 本样例演示了如何使用 COS C SDK 进行对象列出(列出桶中的所有对象) */// COS 的 bucket 名称, [bucket]-[appid], 如: examplebucket-1250000000,可在 https://console.cloud.tencent.com/cos5/bucket 查看char bucket_name[] = "examplebucket-1250000000";// 开发者访问 COS 服务时拥有的用户维度唯一资源标识,用以标识资源,可在 https://console.cloud.tencent.com/cam/capi 页面获取char appid[] = "1250000000";// 开发者拥有的项目身份ID/密钥,可在 https://console.cloud.tencent.com/cam/capi 页面获取char secret_id[] = "xxxxxxxx";char secret_key[] = "xxxxxxxxxxxx";//endpoint 是 COS 访问域名信息(不设置存储桶前缀,访问 COS 时会自动在前面拼接上[bucket]-[appid]), 详情请参见 https://cloud.tencent.com/document/product/436/6224 文档char endpoint[] = "cos.ap-xxx.myqcloud.com";// 是否使用自定域名。如果设置为 COS_TRUE ,则访问 COS 时需要将 endpoint 的值修改为自定义域名int is_cname = COS_FALSE;void init_test_config(cos_config_t* config, int is_cname) { cos_str_set(&config->endpoint, endpoint); cos_str_set(&config->access_key_id, secret_id); cos_str_set(&config->access_key_secret, secret_key); cos_str_set(&config->appid, appid); // cos_str_set(&config->sts_token, token); // 使用临时密钥时的 token config->is_cname = is_cname; // 是否使用自定义域名}void init_test_request_options(cos_request_options_t* options, int is_cname) { options->config = cos_config_create(options->pool); init_test_config(options->config, is_cname); options->ctl = cos_http_controller_create(options->pool, 0);}void log_status(cos_status_t* s) { cos_warn_log("status->code: %d", s->code); 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);}void list_all_objects_demo() { cos_pool_t* p = NULL; cos_status_t* s = NULL; cos_request_options_t* options = NULL; cos_string_t bucket; cos_table_t* resp_headers; int is_truncated = 1; cos_string_t marker; cos_pool_create(&p, NULL); options = cos_request_options_create(p); init_test_request_options(options, is_cname); cos_str_set(&bucket, bucket_name); // list object (get bucket) cos_list_object_params_t* list_params = NULL; list_params = cos_create_list_object_params(p); // 设置最大遍历出多少个对象, 一次listobject最大支持1000 list_params->max_ret = 1000; cos_str_set(&marker, ""); while (is_truncated) { list_params->marker = marker; cos_list_init(&list_params->object_list); s = cos_list_object(options, &bucket, list_params, &resp_headers); if (!cos_status_is_ok(s)) { printf("list object failed, req_id:%s\\n", s->req_id); break; } // list_params->object_list 返回列出的object对象。 cos_list_object_content_t* content = NULL; cos_list_for_each_entry(cos_list_object_content_t, content, &list_params->object_list, node) { printf("object: %s\\n", content->key.data); } is_truncated = list_params->truncated; marker = list_params->next_marker; } cos_pool_destroy(p);}int main() { if (cos_http_io_initialize(NULL, 0) != COSE_OK) { exit(1); } // set log level, default COS_LOG_WARN cos_log_set_level(COS_LOG_WARN); list_all_objects_demo(); // cos_http_io_deinitialize last cos_http_io_deinitialize(); return 0;}完整示例代码请参见:put_object_demo.c// put_object_demo.c#include <stdint.h>#include <stdlib.h>#include <sys/stat.h>#include <unistd.h>#include "cos_api.h"#include "cos_http_io.h"#include "cos_log.h"/** * 本样例演示了如何使用 COS C SDK 进行对象上传(本地文件上传) */// COS 的 bucket 名称, [bucket]-[appid], 如: examplebucket-1250000000,可在 https://console.cloud.tencent.com/cos5/bucket 查看char bucket_name[] = "examplebucket-1250000000";// 开发者访问 COS 服务时拥有的用户维度唯一资源标识,用以标识资源,可在 https://console.cloud.tencent.com/cam/capi 页面获取char appid[] = "1250000000";// 开发者拥有的项目身份ID/密钥,可在 https://console.cloud.tencent.com/cam/capi 页面获取char secret_id[] = "xxxxxxxx";char secret_key[] = "xxxxxxxxxxxx";//endpoint 是 COS 访问域名信息(不设置存储桶前缀,访问 COS 时会自动在前面拼接上[bucket]-[appid]), 详情请参见 https://cloud.tencent.com/document/product/436/6224 文档char endpoint[] = "cos.ap-xxx.myqcloud.com";// 是否使用自定域名。如果设置为 COS_TRUE ,则访问 COS 时需要将 endpoint 的值修改为自定义域名int is_cname = COS_FALSE;//对象名称char object_name[] = "test.txt";//本地文件路径char file_path[] = "test.txt";void init_test_config(cos_config_t* config, int is_cname) { cos_str_set(&config->endpoint, endpoint); cos_str_set(&config->access_key_id, secret_id); cos_str_set(&config->access_key_secret, secret_key); cos_str_set(&config->appid, appid); // cos_str_set(&config->sts_token, token); // 使用临时密钥时的 token config->is_cname = is_cname; // 是否使用自定义域名}void init_test_request_options(cos_request_options_t* options, int is_cname) { options->config = cos_config_create(options->pool); init_test_config(options->config, is_cname); options->ctl = cos_http_controller_create(options->pool, 0);}void log_status(cos_status_t* s) { cos_warn_log("status->code: %d", s->code); 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);}void put_object_from_file_demo() { cos_pool_t* p = NULL; 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_table_t* headers = NULL; // 创建内存池 cos_pool_create(&p, NULL); // 初始化请求选项 options = cos_request_options_create(p); init_test_request_options(options, is_cname); cos_str_set(&bucket, bucket_name); // 限速值设置范围为819200 – 838860800,即100KB/s – 100MB/s,如果超出该范围将返回400错误 // headers = cos_table_make(p, 1); // cos_table_add_int(headers, "x-cos-traffic-limit", 819200); // 上传对象 cos_str_set(&file, file_path); cos_str_set(&object, object_name); s = cos_put_object_from_file(options, &bucket, &object, &file, headers, &resp_headers); if (cos_status_is_ok(s)) { printf("put object succeeded\\n"); } else { printf("put object failed\\n"); } log_status(s); // 销毁内存池 cos_pool_destroy(p);}int main() { if (cos_http_io_initialize(NULL, 0) != COSE_OK) { exit(1); } // set log level, default COS_LOG_WARN // cos_log_set_level(COS_LOG_WARN); put_object_from_file_demo(); // cos_http_io_deinitialize last cos_http_io_deinitialize(); return 0;}完整示例代码请参见:get_object_demo.c// get_object_demo.c#include <stdint.h>#include <stdlib.h>#include <sys/stat.h>#include <unistd.h>#include "cos_api.h"#include "cos_http_io.h"#include "cos_log.h"/** * 本样例演示了如何使用 COS C SDK 进行对象下载(简单下载) */// COS 的 bucket 名称, [bucket]-[appid], 如: examplebucket-1250000000,可在 https://console.cloud.tencent.com/cos5/bucket 查看char bucket_name[] = "examplebucket-1250000000";// 开发者访问 COS 服务时拥有的用户维度唯一资源标识,用以标识资源,可在 https://console.cloud.tencent.com/cam/capi 页面获取char appid[] = "1250000000";// 开发者拥有的项目身份ID/密钥,可在 https://console.cloud.tencent.com/cam/capi 页面获取char secret_id[] = "xxxxxxxx";char secret_key[] = "xxxxxxxxxxxx";//endpoint 是 COS 访问域名信息(不设置存储桶前缀,访问 COS 时会自动在前面拼接上[bucket]-[appid]), 详情请参见 https://cloud.tencent.com/document/product/436/6224 文档char endpoint[] = "cos.ap-xxx.myqcloud.com";// 是否使用自定域名。如果设置为 COS_TRUE ,则访问 COS 时需要将 endpoint 的值修改为自定义域名int is_cname = COS_FALSE;//对象名称char object_name[] = "test.txt";//本地文件路径char file_path[] = "test.txt";void init_test_config(cos_config_t* config, int is_cname) { cos_str_set(&config->endpoint, endpoint); cos_str_set(&config->access_key_id, secret_id); cos_str_set(&config->access_key_secret, secret_key); cos_str_set(&config->appid, appid); // cos_str_set(&config->sts_token, token); // 使用临时密钥时的 token config->is_cname = is_cname; // 是否使用自定义域名}void init_test_request_options(cos_request_options_t* options, int is_cname) { options->config = cos_config_create(options->pool); init_test_config(options->config, is_cname); options->ctl = cos_http_controller_create(options->pool, 0);}void log_status(cos_status_t* s) { cos_warn_log("status->code: %d", s->code); 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);}void get_object_to_file_demo() { cos_pool_t *p = NULL; cos_status_t *s = NULL; cos_request_options_t *options = NULL; cos_string_t bucket; cos_string_t object; cos_table_t *resp_headers; cos_string_t file; cos_table_t *headers = NULL; cos_table_t *params = NULL; cos_pool_create(&p, NULL); options = cos_request_options_create(p); init_test_request_options(options, is_cname); cos_str_set(&bucket, bucket_name); cos_str_set(&file, file_path); cos_str_set(&object, object_name); //限速值设置范围为819200 – 838860800,即100KB/s – 100MB/s,如果超出该范围将返回400错误 // headers = cos_table_make(p, 1); // cos_table_add_int(headers, "x-cos-traffic-limit", 819200); s = cos_get_object_to_file(options, &bucket, &object, headers, params, &file, &resp_headers); log_status(s); { int i = 0; apr_array_header_t * pp = (apr_array_header_t *) apr_table_elts(resp_headers); for ( ; i < pp->nelts; i++) { apr_table_entry_t *ele = (apr_table_entry_t *)pp->elts+i; printf("%s: %s\\n", ele->key, ele->val); } } cos_pool_destroy(p);}int main() { if (cos_http_io_initialize(NULL, 0) != COSE_OK) { exit(1); } // set log level, default COS_LOG_WARN cos_log_set_level(COS_LOG_WARN); get_object_to_file_demo(); // cos_http_io_deinitialize last cos_http_io_deinitialize(); return 0;}注意:对象被删除后,其对应的数据将无法再被访问。完整示例代码请参见:delete_object_demo.c// delete_object_demo.c#include <stdint.h>#include <stdlib.h>#include <sys/stat.h>#include <unistd.h>#include "cos_api.h"#include "cos_http_io.h"#include "cos_log.h"/** * 本样例演示了如何使用 COS C SDK 进行对象删除(单个对象删除) */// COS 的 bucket 名称, [bucket]-[appid], 如: examplebucket-1250000000,可在 https://console.cloud.tencent.com/cos5/bucket 查看char bucket_name[] = "examplebucket-1250000000";// 开发者访问 COS 服务时拥有的用户维度唯一资源标识,用以标识资源,可在 https://console.cloud.tencent.com/cam/capi 页面获取char appid[] = "1250000000";// 开发者拥有的项目身份ID/密钥,可在 https://console.cloud.tencent.com/cam/capi 页面获取char secret_id[] = "xxxxxxxx";char secret_key[] = "xxxxxxxxxxxx";//endpoint 是 COS 访问域名信息(不设置存储桶前缀,访问 COS 时会自动在前面拼接上[bucket]-[appid]), 详情请参见 https://cloud.tencent.com/document/product/436/6224 文档char endpoint[] = "cos.ap-xxx.myqcloud.com";// 是否使用自定域名。如果设置为 COS_TRUE ,则访问 COS 时需要将 endpoint 的值修改为自定义域名int is_cname = COS_FALSE;//对象名称char object_name[] = "test.txt";void init_test_config(cos_config_t* config, int is_cname) { cos_str_set(&config->endpoint, endpoint); cos_str_set(&config->access_key_id, secret_id); cos_str_set(&config->access_key_secret, secret_key); cos_str_set(&config->appid, appid); // cos_str_set(&config->sts_token, token); // 使用临时密钥时的 token config->is_cname = is_cname; // 是否使用自定义域名}void init_test_request_options(cos_request_options_t* options, int is_cname) { options->config = cos_config_create(options->pool); init_test_config(options->config, is_cname); options->ctl = cos_http_controller_create(options->pool, 0);}void log_status(cos_status_t* s) { cos_warn_log("status->code: %d", s->code); 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);}void delete_object_demo() { cos_pool_t *p = NULL; cos_status_t *s = NULL; cos_request_options_t *options = NULL; cos_string_t bucket; cos_string_t object; cos_string_t src_object; cos_string_t src_endpoint; cos_table_t *resp_headers = NULL; //创建内存池 cos_pool_create(&p, NULL); //初始化请求选项 options = cos_request_options_create(p); init_test_request_options(options, is_cname); cos_str_set(&bucket, bucket_name); //设置对象 cos_str_set(&object, object_name); s = cos_delete_object(options, &bucket, &object, &resp_headers); log_status(s); if (cos_status_is_ok(s)) { printf("delete object succeeded\\n"); } else { printf("delete object failed\\n"); } //销毁内存池 cos_pool_destroy(p);}int main() { if (cos_http_io_initialize(NULL, 0) != COSE_OK) { exit(1); } // set log level, default COS_LOG_WARN cos_log_set_level(COS_LOG_WARN); delete_object_demo(); // cos_http_io_deinitialize last cos_http_io_deinitialize(); return 0;}

八、编译和运行 Demo 示例

仍然以 Linux 为例,请确保安装时设置了 PKG_CONFIG_PATH 和 LD_LIBRARY_PATH 环境变量。

九、编译

执行:

pkg-config –cflags –libs apr-1 apr-util-1 mxml libcurl

可以得到编译选项,如:

-I/usr/local/apr/include/apr-1 -DLINUX -D_GNU_SOURCE -g -O2 -pthread -I/usr/local/include -D_THREAD_SAFE -D_REENTRANT -L/usr/local/apr/lib -laprutil-1 -lexpat -lapr-1 -lrt -lcrypt -ldl -L/usr/local/lib -lmxml -lpthread -lcurl

还需为其加上 cos-c-sdk 的编译选项-I/usr/local/include/cos_c_sdk -lcos_c_sdk,最终编译选项如下:

-I/usr/local/include/cos_c_sdk -I/usr/local/apr/include/apr-1 -I/usr/local/include -DLINUX -D_GNU_SOURCE -g -O2 -pthread -D_THREAD_SAFE -D_REENTRANT -L/usr/local/lib -lcos_c_sdk -L/usr/local/apr/lib -laprutil-1 -lexpat -lapr-1 -lrt -lcrypt -ldl -lmxml -lpthread -lcurl

注意:说明:

注意:在最新的提交中,cos-c-sdk 已支持 pkg-config,可直接通过运行pkg-config –cflags –libs cos_c_sdk apr-1 apr-util-1 mxml libcurl命令生成带 cos-c-sdk 信息的编译选项。

以 get_bucket_list_demo.c 为例,代码中设置好 appid、secret_id、secret_key、endpoint 等参数后,可以使用以下命令进行编译:

gcc get_bucket_list_demo.c -o get_bucket_list_demo -I/usr/local/include/cos_c_sdk -I/usr/local/apr/include/apr-1 -I/usr/local/include -DLINUX -D_GNU_SOURCE -g -O2 -pthread -D_THREAD_SAFE -D_REENTRANT -L/usr/local/lib -lcos_c_sdk -L/usr/local/apr/lib -laprutil-1 -lexpat -lapr-1 -lrt -lcrypt -ldl -lmxml -lpthread -lcurl

十、运行

执行刚才编译得到的二进制程序:

./get_bucket_list_demo

如果成功运行,且当前 appid 下有存储桶,那么 get_bucket_list_demo 将会列出当前账号下的所有存储桶。

十一、常见问题

你在使用过程中可能会碰到的一些常见问题,相关的解决办法可参见 C SDK 常见问题。

赞 (0)
上一篇 5天前
下一篇 5天前