tencent cloud

对象存储

动态与公告
产品动态
产品公告
产品简介
产品概述
功能概览
应用场景
产品优势
基本概念
地域和访问域名
规格与限制
产品计费
计费概述
计费方式
计费项
免费额度
计费示例
查看和下载账单
欠费说明
常见问题
快速入门
控制台快速入门
COSBrowser 快速入门
用户指南
创建请求
存储桶
对象
数据管理
批量处理
全球加速
监控与告警
运维中心
数据处理
内容审核
智能工具箱
数据工作流
应用集成
工具指南
工具概览
环境安装与配置
COSBrowser 工具
COSCLI 工具
COSCMD 工具
COS Migration 工具
FTP Server 工具
Hadoop 工具
COSDistCp 工具
HDFS TO COS 工具
GooseFS-Lite 工具
在线辅助工具
自助诊断工具
实践教程
概览
访问控制与权限管理
性能优化
使用 AWS S3 SDK 访问 COS
数据容灾备份
域名管理实践
图片处理实践
COS 音视频播放器实践
工作流实践
数据直传
内容审核实践
数据安全
数据校验
大数据实践
COS 成本优化解决方案
在第三方应用中使用 COS
迁移指南
本地数据迁移至 COS
第三方云存储数据迁移至 COS
以 URL 作为源地址的数据迁移至 COS
COS 之间数据迁移
Hadoop 文件系统与 COS 之间的数据迁移
数据湖存储
云原生数据湖
元数据加速
数据加速器 GooseFS
数据处理
数据处理概述
图片处理
媒体处理
内容审核
文件处理
文档处理
故障处理
获取 RequestId 操作指引
通过外网上传文件至 COS 缓慢
访问 COS 时返回403错误码
资源访问异常
POST Object 常见异常
API 文档
简介
公共请求头部
公共响应头部
错误码
请求签名
操作列表
Service 接口
Bucket 接口
Object 接口
批量处理接口
数据处理接口
任务与工作流
内容审核接口
云查毒接口
SDK 文档
SDK 概览
准备工作
Android SDK
C SDK
C++ SDK
.NET(C#) SDK
Flutter SDK
Go SDK
iOS SDK
Java SDK
JavaScript SDK
Node.js SDK
PHP SDK
Python SDK
React Native SDK
小程序 SDK
错误码
鸿蒙(Harmony) SDK
终端 SDK 质量优化
安全与合规
数据容灾
数据安全
访问管理
常见问题
热门问题
一般性问题
计费计量问题
域名合规问题
存储桶配置问题
域名和 CDN 问题
文件操作问题
日志监控问题
权限管理问题
数据处理问题
数据安全问题
预签名 URL 问题
SDK 类问题
工具类问题
API 类问题
服务协议
Service Level Agreement
隐私政策
数据处理和安全协议
联系我们
词汇表

快速入门

PDF
フォーカスモード
フォントサイズ
最終更新日: 2025-12-29 16:38:20

相关资源

对象存储的 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://www.tencentcloud.com/document/product/436/14048
cos_str_set(&options->config->access_key_secret, "<用户的SecretKey>"); //临时密钥的 SecretKey,临时密钥生成和使用指引参见https://www.tencentcloud.com/document/product/436/14048
cos_str_set(&options->config->sts_token, "<用户的StsToken>"); //临时密钥的 Token,临时密钥生成和使用指引参见https://www.tencentcloud.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://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1
cos_str_set(&options->config->access_key_secret, "<用户的SecretKey>"); //用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1
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.tencentcloud.com/cos5/bucket 查看
char bucket_name[] = "examplebucket-1250000000";
// 开发者访问 COS 服务时拥有的用户维度唯一资源标识,用以标识资源,可在 https://console.tencentcloud.com/cam/capi 页面获取
char appid[] = "1250000000";
// 开发者拥有的项目身份ID/密钥,可在 https://console.tencentcloud.com/cam/capi 页面获取
char secret_id[] = "xxxxxxxx";
char secret_key[] = "xxxxxxxxxxxx";
//endpoint 是 COS 访问域名信息(不设置存储桶前缀,访问 COS 时会自动在前面拼接上[bucket]-[appid]), 详情请参见 https://www.tencentcloud.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.tencentcloud.com/cam/capi 页面获取
char appid[] = "1250000000";
// 开发者拥有的项目身份ID/密钥,可在 https://console.tencentcloud.com/cam/capi 页面获取
char secret_id[] = "xxxxxxxx";
char secret_key[] = "xxxxxxxxxxxx";
//endpoint 是 COS 访问域名信息(不设置存储桶前缀,访问 COS 时会自动在前面拼接上[bucket]-[appid]), 详情请参见 https://www.tencentcloud.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.tencentcloud.com/cos5/bucket 查看
char bucket_name[] = "examplebucket-1250000000";
// 开发者访问 COS 服务时拥有的用户维度唯一资源标识,用以标识资源,可在 https://console.tencentcloud.com/cam/capi 页面获取
char appid[] = "1250000000";
// 开发者拥有的项目身份ID/密钥,可在 https://console.tencentcloud.com/cam/capi 页面获取
char secret_id[] = "xxxxxxxx";
char secret_key[] = "xxxxxxxxxxxx";
//endpoint 是 COS 访问域名信息(不设置存储桶前缀,访问 COS 时会自动在前面拼接上[bucket]-[appid]), 详情请参见 https://www.tencentcloud.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.tencentcloud.com/cos5/bucket 查看
char bucket_name[] = "examplebucket-1250000000";
// 开发者访问 COS 服务时拥有的用户维度唯一资源标识,用以标识资源,可在 https://console.tencentcloud.com/cam/capi 页面获取
char appid[] = "1250000000";
// 开发者拥有的项目身份ID/密钥,可在 https://console.tencentcloud.com/cam/capi 页面获取
char secret_id[] = "xxxxxxxx";
char secret_key[] = "xxxxxxxxxxxx";
//endpoint 是 COS 访问域名信息(不设置存储桶前缀,访问 COS 时会自动在前面拼接上[bucket]-[appid]), 详情请参见 https://www.tencentcloud.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.tencentcloud.com/cos5/bucket 查看
char bucket_name[] = "examplebucket-1250000000";
// 开发者访问 COS 服务时拥有的用户维度唯一资源标识,用以标识资源,可在 https://console.tencentcloud.com/cam/capi 页面获取
char appid[] = "1250000000";
// 开发者拥有的项目身份ID/密钥,可在 https://console.tencentcloud.com/cam/capi 页面获取
char secret_id[] = "xxxxxxxx";
char secret_key[] = "xxxxxxxxxxxx";
//endpoint 是 COS 访问域名信息(不设置存储桶前缀,访问 COS 时会自动在前面拼接上[bucket]-[appid]), 详情请参见 https://www.tencentcloud.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.tencentcloud.com/cos5/bucket 查看
char bucket_name[] = "examplebucket-1250000000";
// 开发者访问 COS 服务时拥有的用户维度唯一资源标识,用以标识资源,可在 https://console.tencentcloud.com/cam/capi 页面获取
char appid[] = "1250000000";
// 开发者拥有的项目身份ID/密钥,可在 https://console.tencentcloud.com/cam/capi 页面获取
char secret_id[] = "xxxxxxxx";
char secret_key[] = "xxxxxxxxxxxx";
//endpoint 是 COS 访问域名信息(不设置存储桶前缀,访问 COS 时会自动在前面拼接上[bucket]-[appid]), 详情请参见 https://www.tencentcloud.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 常见问题


ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック