快速入门

最近更新时间:2025-12-08 18:21:11

我的收藏

相关资源

对象存储的 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

1. 安装 CMake 工具(建议2.6.0及以上版本),单击 这里 下载,安装方式如下:
./configure
make
make install
2. 安装 libcurl(建议7.32.0及以上版本),单击 这里 下载,安装方式如下:
./configure
make
make install
3. 安装 apr(建议1.5.2及以上版本),单击 这里 下载,安装方式如下:
./configure
make
make install
4. 安装 apr-util(建议1.5.4及以上版本),单击 这里 下载,安装时需要指定 --with-apr 选项,安装方式如下:
./configure --with-apr=/your/apr/install/path
make
make install
5. 安装 minixml(建议2.8 - 2.12版本),单击 这里 下载,安装方式如下:
./configure
make
make install
6. 编译和安装 COS C SDK。下载 XML C SDK 源码,执行如下命令:
cmake .
make
make 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/pkgconfig
export 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 发起请求并获得请求响应结果。

初始化

注意:
建议用户使用子账号密钥 + 环境变量的方式调用 SDK,提高 SDK 使用的安全性。为子账号授权时,请遵循 最小权限指引原则,防止泄漏目标存储桶或对象之外的资源。
如果您一定要使用永久密钥,建议遵循 最小权限指引原则 对永久密钥的权限范围进行限制。
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/14048
cos_str_set(&options->config->access_key_secret, "<用户的SecretKey>"); //临时密钥的 SecretKey,临时密钥生成和使用指引参见https://cloud.tencent.com/document/product/436/14048
cos_str_set(&options->config->sts_token, "<用户的StsToken>"); //临时密钥的 Token,临时密钥生成和使用指引参见https://cloud.tencent.com/document/product/436/14048
cos_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/37140
cos_str_set(&options->config->access_key_secret, "<用户的SecretKey>"); //用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
cos_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 常见问题