下载对象

最近更新时间:2024-08-13 16:19:51

我的收藏

简介

本文介绍对象存储 COS 通过 C++ SDK 实现下载对象功能的示例代码和描述。包括高级接口、简单接口、异步高级接口、异步简单接口四个部分。

注意事项

若您想要下载对象,需要具有目标对象的读权限:在您进行 授权策略 时,action 需要设置为cos:GetObject ,更多授权请参见 支持CAM的业务接口

相关示例

功能名称
描述
示例代码
高级接口
高级接口,基于 range 使用多线程并发下载多个分块,仅支持下载到文件。分两种接口,一种是多线程版本,另一种是多线程断点下载版本。
简单接口
GET Object 接口可以实现流式下载和下载对象到本地文件,不支持断点下载功能。
异步高级接口
异步高级接口封装了高级接口,基于 range 使用多线程并发下载多个分块,仅支持下载到文件。分两种接口,一种是多线程版本,另一种是多线程断点下载版本。支持进度回调和下载状态回调功能。
异步简单接口
异步高级接口封装了简单接口,基于 range 使用多线程并发下载多个分块,仅支持下载到文件,支持进度回调和下载状态回调功能。不支持多线程和断点下载功能。

高级接口(推荐)

注意:
仅支持下载到文件。
高级接口会多线程并发下载多个分块。
分块大小支持用户自行配置,默认为4MB。
下载线程池大小支持用户自行配置,默认10。

前期准备:创建 CosAPI

调用 COS 的接口之前,必须先创建一个 CosAPI 的实例。这个实例用来后续调用请求。
qcloud_cos::CosAPI InitCosAPI() {
uint64_t appid = 12500000000;
std::string region = "ap-guangzhou";// bucket 的地域,请参见 https://cloud.tencent.com/document/product/436/62
std::string secret_id = "AKIDXXXXXXXX"; //用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
std::string secret_key = "1A2Z3YYYYYYYYYY"; //用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
qcloud_cos::CosConfig config(appid, secret_id, secret_key, region);
qcloud_cos::CosAPI cos_tmp(config);
return cos_tmp;
}

前期准备:使用临时密钥创建 CosAPI

如果要使用临时密钥请求 COS,则需要用临时密钥创建 CosAPI 实例。
qcloud_cos::CosAPI InitCosAPI() {
// 需要已经获取到临时密钥的结果:tmp_secret_id、tmp_secret_key、
// 临时密钥的生成参见 https://cloud.tencent.com/document/product/436/14048#cos-sts-sdk
uint64_t appid = 12500000000;
std::string region = "ap-guangzhou";
std::string tmp_secret_id = "AKIDXXXXXXXX";
std::string tmp_secret_key = "1A2Z3YYYYYYYYYY";
std::string tmp_token = "token";
qcloud_cos::CosConfig config(appid, tmp_secret_id, tmp_secret_key, region);
config.SetTmpToken(tmp_token);
qcloud_cos::CosAPI cos_tmp(config);
return cos_tmp;
}

使用案例:多线程下载接口

说明:
该 Demo 示范如何使用高级接口多线程版本下载对象。
仅支持下载到文件。
可通过全局设置下载线程池大小、分块大小。该下载线程池是每次下载独立的。
方法原型
CosResult CosAPI::MultiGetObject(const MultiGetObjectReq& req, MultiGetObjectResp* resp)
请求示例
void MultiGetObjectDemo(qcloud_cos::CosAPI& cos) {
std::string file_path = "test_file/big_file.txt";
std::string object_name = "big_file.txt";
// 此配置是全局性配置,主动设置后,后续涉及多线程下载的接口,都使用此配置
CosSysConfig::SetDownThreadPoolSize(10); // 下载线程池大小 默认10
CosSysConfig::SetDownSliceSize(4 * 1024 * 1024); // 下载 range 大小 默认4M
qcloud_cos::MultiGetObjectReq req(bucket_name, object_name, file_path);
qcloud_cos::MultiGetObjectResp resp;
qcloud_cos::CosResult result = cos.MultiGetObject(req, &resp);
std::cout << "===================GetObjectResponse=====================" << std::endl;
PrintResult(result, resp);
std::cout << "=========================================================" << std::endl;
}
参数说明
参数名称
描述
类型
req
下载文件请求
MultiGetObjectReq
resp
下载文件响应
MultiGetObjectResp
MultiGetObjectReq 成员或函数说明:
成员或函数
描述
参数类型
bucket_name
存储桶名,可通过构造函数或 set 方法进行设置
存储桶的命名格式为 BucketName-APPID,详情请参见 命名规范
string
object_name
对象键(Key),可通过构造函数或 set 方法进行设置
是对象在存储桶中的唯一标识。例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键
string
local_file_path
本地文件路径,可通过构造函数或 set 方法进行设置
string
SetTrafficLimit
用于对下载对象进行流量控制,单位:bit/s,默认不进行流量控制
string
MultiGetObjectResp 成员函数说明:
成员函数
描述
返回类型
GetXCosMetas
获取自定义的元数据map
map<std::string, std::string>
GetXCosMeta
获取指定自定义的元数据
string
GetXCosServerSideEncryption
获取 Server 端加密使用的算法
string
GetEtag
获取存储下载对象的 Etag
string
GetXCosRequestId
获取请求 ID
string

CosSysConfig 类用于进行相关的配置,在该样例中主要成员函数说明如下:
成员函数
描述
参数类型
SetDownSliceSize
设置分块下载的块大小,单位:字节(Byte),默认为4MB
设置方法为CosSysConfig::SetDownSliceSize(4 * 1024 * 1024)
uint64_t
SetDownThreadPoolSize
设置下载线程池大小,默认为10。
设置方法为CosSysConfig::SetDownThreadPoolSize(10)
unsigned
返回说明
CosResult 主要成员函数说明如下:
成员函数
描述
返回类型
IsSucc
判断是否成功,成功返回 true,失败返回 false
bool
GetHttpStatus
获取 http 状态码
int
GetErrorCode
获取请求失败时获取错误码
string
GetErrorMsg
获取请求失败时获取错误信息
string
GetXCosRequestId
获取请求 ID
string
对 CosResult 的使用样例如下,用户可根据信息选择使用:
void PrintResult(const qcloud_cos::CosResult& result, const qcloud_cos::BaseResp& resp) {
if (result.IsSucc()) {
std::cout << "Request Succ." << std::endl;
std::cout << resp.DebugString() << std::endl;
} else {
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
std::cout << "ResourceAddr=" << result.GetResourceAddr() << std::endl;
std::cout << "XCosRequestId=" << result.GetXCosRequestId() << std::endl;
std::cout << "XCosTraceId=" << result.GetXCosTraceId() << std::endl;
}
}

使用案例:多线程断点下载接口

说明:
该 Demo 示范如何使用高级接口多线程断点版本下载对象。
仅支持下载到文件。
可通过全局设置下载线程池大小、分块大小。该下载线程池是每次下载独立的。
方法原型
CosResult CosAPI::ResumableGetObject(const GetObjectByFileReq& req, GetObjectByFileResp* resp)
请求示例
void ResumableGetObjectDemo(qcloud_cos::CosAPI& cos) {
std::string file_path = "test_file/big_file.txt";
std::string object_name = "big_file.txt";

qcloud_cos::GetObjectByFileReq req(bucket_name, object_name, file_path);
qcloud_cos::GetObjectByFileResp resp;

CosResult result = cos.ResumableGetObject(req, &resp);
std::cout << "===================ResumableGetObject====================" << std::endl;
PrintResult(result, resp);
std::cout << "=========================================================" << std::endl;
}
参数说明
参数名称
描述
类型
req
下载文件请求
GetObjectByFileReq
resp
下载文件响应
GetObjectByFileResp
GetObjectByFileReq 成员或函数说明:
成员或函数
描述
参数类型
bucket_name
存储桶名,可通过构造函数或 set 方法进行设置
存储桶的命名格式为 BucketName-APPID,详情请参见 命名规范
string
object_name
对象键(Key),可通过构造函数或 set 方法进行设置
是对象在存储桶中的唯一标识。例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键
string
local_file_path
本地文件路径,可通过构造函数或 set 方法进行设置
string
SetTrafficLimit
用于对下载对象进行流量控制,单位:bit/s,默认不进行流量控制
uint64_t
GetObjectByFileResp 成员函数说明:
成员函数
描述
返回类型
GetXCosMetas
获取自定义的元数据map
map<std::string, std::string>
GetXCosMeta
获取指定自定义的元数据
string
GetXCosServerSideEncryption
获取 Server 端加密使用的算法
string
GetEtag
获取存储下载对象的 Etag
string
GetXCosRequestId
获取请求 ID
string
返回说明
CosResult 主要成员函数说明如下:
成员函数
描述
返回类型
IsSucc
判断是否成功,成功返回 true,失败返回 false。
bool
GetHttpStatus
获得 http 状态码。
int
GetErrorCode
请求失败时获取错误码。
string
GetErrorMsg
请求失败时获取错误信息。
string
GetXCosRequestId
获取请求 ID。
string
对 CosResult 的使用样例如下,用户可根据信息选择使用:
void PrintResult(const qcloud_cos::CosResult& result, const qcloud_cos::BaseResp& resp) {
if (result.IsSucc()) {
std::cout << "Request Succ." << std::endl;
std::cout << resp.DebugString() << std::endl;
} else {
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
std::cout << "ResourceAddr=" << result.GetResourceAddr() << std::endl;
std::cout << "XCosRequestId=" << result.GetXCosRequestId() << std::endl;
std::cout << "XCosTraceId=" << result.GetXCosTraceId() << std::endl;
}
}

简单接口

前期准备:创建 CosAPI

调用 COS 的接口之前,必须先创建一个 CosAPI 的实例。这个实例用来后续调用请求。
qcloud_cos::CosAPI InitCosAPI() {
uint64_t appid = 12500000000;
std::string region = "ap-guangzhou";// bucket 的地域,请参见 https://cloud.tencent.com/document/product/436/62
std::string secret_id = "AKIDXXXXXXXX"; //用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
std::string secret_key = "1A2Z3YYYYYYYYYY"; //用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
qcloud_cos::CosConfig config(appid, secret_id, secret_key, region);
qcloud_cos::CosAPI cos_tmp(config);
return cos_tmp;
}

前期准备:使用临时密钥创建 CosAPI

如果要使用临时密钥请求 COS,则需要用临时密钥创建 CosAPI 实例。
qcloud_cos::CosAPI InitCosAPI() {
// 需要已经获取到临时密钥的结果:tmp_secret_id、tmp_secret_key、
// 临时密钥的生成参见 https://cloud.tencent.com/document/product/436/14048#cos-sts-sdk
uint64_t appid = 12500000000;
std::string region = "ap-guangzhou";
std::string tmp_secret_id = "AKIDXXXXXXXX";
std::string tmp_secret_key = "1A2Z3YYYYYYYYYY";
std::string tmp_token = "token";
qcloud_cos::CosConfig config(appid, tmp_secret_id, tmp_secret_key, region);
config.SetTmpToken(tmp_token);
qcloud_cos::CosAPI cos_tmp(config);
return cos_tmp;
}

使用案例:下载到本地文件

说明:
该 Demo 演示了如何使用 COS C++ SDK 下载对象到本地文件。
方法原型
CosResult CosAPI::GetObject(const GetObjectByFileReq& req, GetObjectByFileResp* resp)
请求示例
void GetObjectByFileDemo(qcloud_cos::CosAPI& cos) {
std::string object_name = "test_src.txt";
std::string file_path = "./test_file/text2.txt";
qcloud_cos::GetObjectByFileReq req(bucket_name, object_name, file_path);
// 限速下载对象,默认单位为 bit/s,限速值设置范围为 819200 - 838860800
// uint64_t traffic_limit = 0;
// req.SetTrafficLimit(traffic_limit);
qcloud_cos::GetObjectByFileResp resp;
qcloud_cos::CosResult result = cos.GetObject(req, &resp);
std::cout << "===================GetObjectResponse=====================" << std::endl;
PrintResult(result, resp);
std::cout << "=========================================================" << std::endl;
}
参数说明
参数名称
描述
类型
req
下载文件请求
GetObjectByFileReq
resp
下载文件响应
GetObjectByFileResp
GetObjectByFileReq 成员或函数说明:
成员或函数
描述
参数类型
bucket_name
存储桶名,可通过构造函数或 set 方法进行设置
存储桶的命名格式为 BucketName-APPID,详情请参见 命名规范
string
object_name
对象键(Key),可通过构造函数或 set 方法进行设置
是对象在存储桶中的唯一标识。例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键
string
local_file_path
本地文件路径,可通过构造函数或 set 方法进行设置
string
SetTrafficLimit
设置单链接限速,设置方法为 req.SetTrafficLimit(819200),默认单位为 bit/s,限速值设置范围为 819200 - 838860800
uint64_t
GetObjectByFileResp 成员函数说明:
成员函数
描述
返回类型
GetXCosMetas
获取自定义的元数据map
map<std::string, std::string>
GetXCosMeta
获取指定自定义的元数据
string
GetXCosServerSideEncryption
获取 Server 端加密使用的算法
string
GetEtag
获取存储下载对象的 Etag
string
GetXCosRequestId
获取请求 ID
string
返回说明
CosResult 主要成员函数说明如下:
成员函数
描述
返回类型
IsSucc
判断是否成功,成功返回 true,失败返回 false。
bool
GetHttpStatus
获得 http 状态码。
int
GetErrorCode
请求失败时获取错误码。
string
GetErrorMsg
请求失败时获取错误信息。
string
GetXCosRequestId
获取请求 ID。
string
对 CosResult 的使用样例如下,用户可根据信息选择使用:
void PrintResult(const qcloud_cos::CosResult& result, const qcloud_cos::BaseResp& resp) {
if (result.IsSucc()) {
std::cout << "Request Succ." << std::endl;
std::cout << resp.DebugString() << std::endl;
} else {
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
std::cout << "ResourceAddr=" << result.GetResourceAddr() << std::endl;
std::cout << "XCosRequestId=" << result.GetXCosRequestId() << std::endl;
std::cout << "XCosTraceId=" << result.GetXCosTraceId() << std::endl;
}
}

使用案例:下载到流

说明:
该 Demo 演示了如何使用 COS C++ SDK 下载对象到流。
方法原型
CosResult CosAPI::GetObject(const GetObjectByStreamReq& req, GetObjectByStreamResp* resp)
请求示例
void GetObjectByStreamDemo(qcloud_cos::CosAPI& cos) {
std::string object_name = "test.txt";
std::ostringstream os;
qcloud_cos::GetObjectByStreamReq req(bucket_name, object_name, os);
// 限速下载对象,默认单位为 bit/s,限速值设置范围为 819200 - 838860800
// uint64_t traffic_limit = 0;
// req.SetTrafficLimit(traffic_limit);
qcloud_cos::GetObjectByStreamResp resp;
qcloud_cos::CosResult result = cos.GetObject(req, &resp);
std::cout << "===================GetObjectResponse=====================" << std::endl;
PrintResult(result, resp);
std::cout << "=========================================================" << std::endl;
std::cout << os.str() << std::endl;
}
参数说明
参数名称
描述
类型
req
下载文件请求
GetObjectByStreamReq
resp
下载文件响应
GetObjectByStreamResp
GetObjectByStreamReq 成员或函数说明:
成员或函数
描述
参数类型
bucket_name
存储桶名,可通过构造函数或 set 方法进行设置
存储桶的命名格式为 BucketName-APPID,详情请参见 命名规范
string
object_name
对象键(Key),可通过构造函数或 set 方法进行设置
是对象在存储桶中的唯一标识。例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键
string
os
输出流,可通过构造函数进行设置
ostream
SetTrafficLimit
设置单链接限速,设置方法为 req.SetTrafficLimit(819200),默认单位为 bit/s,限速值设置范围为 819200 - 838860800
uint64_t
GetObjectByStreamResp 成员函数说明:
成员函数
描述
返回类型
GetXCosMetas
获取自定义的元数据map
map<std::string, std::string>
GetXCosMeta
获取指定自定义的元数据
string
GetXCosServerSideEncryption
获取 Server 端加密使用的算法
string
GetEtag
获取存储下载对象的 Etag
string
GetXCosRequestId
获取请求 ID
string
返回说明
CosResult 主要成员函数说明如下:
成员函数
描述
返回类型
IsSucc
判断是否成功,成功返回 true,失败返回 false。
bool
GetHttpStatus
获得 http 状态码。
int
GetErrorCode
请求失败时获取错误码。
string
GetErrorMsg
请求失败时获取错误信息。
string
GetXCosRequestId
获取请求 ID。
string
对 CosResult 的使用样例如下,用户可根据信息选择使用:
void PrintResult(const qcloud_cos::CosResult& result, const qcloud_cos::BaseResp& resp) {
if (result.IsSucc()) {
std::cout << "Request Succ." << std::endl;
std::cout << resp.DebugString() << std::endl;
} else {
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
std::cout << "ResourceAddr=" << result.GetResourceAddr() << std::endl;
std::cout << "XCosRequestId=" << result.GetXCosRequestId() << std::endl;
std::cout << "XCosTraceId=" << result.GetXCosTraceId() << std::endl;
}
}

异步高级接口

注意:
仅支持下载到文件
多线程并发同时下载多个分块。
分块大小支持用户自行配置,默认为4MB。
下载线程池大小支持用户自行配置,默认10。
异步线程池大小支持用户自行配置,默认为2。

前期准备:创建 CosAPI

调用 COS 的接口之前,必须先创建一个 CosAPI 的实例。这个实例用来后续调用请求。
qcloud_cos::CosAPI InitCosAPI() {
uint64_t appid = 12500000000;
std::string region = "ap-guangzhou";// bucket 的地域,请参见 https://cloud.tencent.com/document/product/436/62
std::string secret_id = "AKIDXXXXXXXX"; //用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
std::string secret_key = "1A2Z3YYYYYYYYYY"; //用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
qcloud_cos::CosConfig config(appid, secret_id, secret_key, region);
qcloud_cos::CosAPI cos_tmp(config);
return cos_tmp;
}

前期准备:使用临时密钥创建 CosAPI

如果要使用临时密钥请求 COS,则需要用临时密钥创建 CosAPI 实例。
qcloud_cos::CosAPI InitCosAPI() {
// 需要已经获取到临时密钥的结果:tmp_secret_id、tmp_secret_key、
// 临时密钥的生成参见 https://cloud.tencent.com/document/product/436/14048#cos-sts-sdk
uint64_t appid = 12500000000;
std::string region = "ap-guangzhou";
std::string tmp_secret_id = "AKIDXXXXXXXX";
std::string tmp_secret_key = "1A2Z3YYYYYYYYYY";
std::string tmp_token = "token";
qcloud_cos::CosConfig config(appid, tmp_secret_id, tmp_secret_key, region);
config.SetTmpToken(tmp_token);
qcloud_cos::CosAPI cos_tmp(config);
return cos_tmp;
}

使用案例:异步多线程下载接口

说明:
该 Demo 示范如何使用异步多线程下载接口进行对象下载。包含进度回调和下载状态回调的样例。
仅支持文件下载,不支持流式下载。
可通过全局设置下载线程池大小、分块大小。该下载线程池是每次下载独立的。
可通过全局设置异步线程池大小。该线程池全局共用,供异步调度使用。

方法原型

SharedAsyncContext CosAPI::AsyncMultiGetObject(const AsyncMultiGetObjectReq& req)

请求示例

/*
* 该方法是异步下载对象的进度回调示例
*/
void ProgressCallback(uint64_t transferred_size, uint64_t total_size, void* user_data) {
qcloud_cos::ObjectReq* req = static_cast<qcloud_cos::ObjectReq*>(user_data);
if (0 == transferred_size % 1048576) {
std::cout << "ObjectName:" << req->GetObjectName() << ", TranferedSize:" << transferred_size << ",TotalSize:" << total_size << std::endl;
}
}
/*
* 该方法是异步下载对象的完成回调示例
*/
void GetObjectAsyncDoneCallback(const SharedAsyncContext& context, void* user_data) {
UNUSED_PARAM(user_data)
std::cout << "AsyncMultiGetObjectDemoCallback, BucketName:"
<< context->GetBucketName()
<< ", ObjectName:" << context->GetObjectName()
<< ", LocalFile:" << context->GetLocalFilePath() << std::endl;
// qcloud_cos::MultiGetObjectReq对应的响应为qcloud_cos::GetObjectByFileResp
if (context->GetResult().IsSucc()) {
// 获取响应
std::cout << "GetObject succeed" << std::endl;
std::cout << "Result:" << context->GetResult().DebugString() << std::endl;
AsyncResp resp = context->GetAsyncResp();
std::cout << "ETag:" << resp.GetEtag() << std::endl;
std::cout << "Crc64:" << resp.GetXCosHashCrc64Ecma() << std::endl;
} else {
std::cout << "GetObject failed" << std::endl;
std::cout << "ErrorMsg:" << context->GetResult().GetErrorMsg() << std::endl;
}
}

void AsyncMultiGetObjectDemo(qcloud_cos::CosAPI& cos) {
CosSysConfig::SetAsynThreadPoolSize(2); // 设置异步线程池大小 默认2

std::string local_file = "test_file/big_file.txt";
std::string object_name = "big_file.txt";
qcloud_cos::AsyncMultiGetObjectReq req(bucket_name, object_name, local_file);
// 设置下载进度回调
req.SetTransferProgressCallback(&ProgressCallback);
// 设置下载状态回调
req.SetDoneCallback(&GetObjectAsyncDoneCallback);
// 设置私有数据,对应回调中的 user_data
req.SetUserData(&req);

// 开始下载
SharedAsyncContext context = cos.AsyncMultiGetObject(req);

std::cout << "===================AsyncMultiGetObject======================" << std::endl;
// 等待下载结束
std::cout << "wait finish..." << std::endl;
context->WaitUntilFinish();
// 检查结果
if (context->GetResult().IsSucc()) {
// 获取响应
std::cout << "AsyncMultiGetObject succeed" << std::endl;
std::cout << "Result:" << context->GetResult().DebugString() << std::endl;
AsyncResp resp = context->GetAsyncResp();
std::cout << "ETag:" << resp.GetEtag() << std::endl;
std::cout << "Crc64:" << resp.GetXCosHashCrc64Ecma() << std::endl;
} else {
std::cout << "AsyncMultiGetObject failed" << std::endl;
std::cout << "ErrorMsg:" << context->GetResult().GetErrorMsg() << std::endl;
}
std::cout << "============================================================" << std::endl;
}

参数说明

参数名称
描述
类型
req
下载文件请求
AsyncMultiGetObjectReq
AsyncMultiGetObjectReq 成员或函数说明:
成员或函数
描述
参数类型
bucket_name
存储桶名,可通过构造函数或 set 方法进行设置
存储桶的命名格式为 BucketName-APPID,详情请参见 命名规范
string
object_name
对象键(Key),可通过构造函数或 set 方法进行设置
是对象在存储桶中的唯一标识。例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键
string
local_file_path
本地文件路径,可通过构造函数或 set 方法进行设置
string
SetTransferProgressCallback
设置下载进度回调方法
TransferProgressCallback
SetDoneCallback
设置下载进度状态方法
DoneCallback
CosSysConfig 类用于进行相关的配置,在该样例中主要成员函数说明如下:
成员函数
描述
参数类型
SetAsynThreadPoolSize
设置异步线程池的大小,默认为2
设置方法为CosSysConfig::SetAsynThreadPoolSize(2)
unsigned

返回说明

context 主要成员函数说明如下:
成员函数
描述
返回类型
WaitUntilFinish
等待下载结束
GetResult
获取 Result 结果
CosResult
GetAsyncResp
获取 Resp 响应结果
AsyncResp
AsyncResp 主要成员函数说明如下:
成员函数
描述
返回类型
GetXCosHashCrc64Ecma
获取存储下载对象的 CRC64
string
GetEtag
获取存储下载对象的 Etag
string
GetXCosRequestId
获取请求 ID
string
CosResult 主要成员函数说明如下:
成员函数
描述
返回类型
IsSucc
判断是否成功,成功返回 true,失败返回 false
bool
GetHttpStatus
获取 http 状态码
int
GetErrorCode
获取请求失败时获取错误码
string
GetErrorMsg
获取请求失败时获取错误信息
string
GetXCosRequestId
获取请求 ID
string
对 CosResult 的使用样例如下,用户可根据信息选择使用:
void PrintResult(const qcloud_cos::CosResult& result, const qcloud_cos::BaseResp& resp) {
if (result.IsSucc()) {
std::cout << "Request Succ." << std::endl;
std::cout << resp.DebugString() << std::endl;
} else {
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
std::cout << "ResourceAddr=" << result.GetResourceAddr() << std::endl;
std::cout << "XCosRequestId=" << result.GetXCosRequestId() << std::endl;
std::cout << "XCosTraceId=" << result.GetXCosTraceId() << std::endl;
}
}

使用案例:异步多线程断点下载接口

说明:
该 Demo 示范如何使用异步多线程断点下载接口进行对象下载。包含进度回调和下载状态回调的样例。
仅支持文件下载,不支持流式下载,支持断点下载功能。
可通过全局设置下载线程池大小、分块大小。该下载线程池是每次下载独立的。
可通过全局设置异步线程池大小。该线程池全局共用,供异步调度使用。

方法原型

SharedAsyncContext CosAPI::AsyncResumableGetObject(const AsyncGetObjectReq& req)

请求示例

/*
* 该方法是异步下载对象的进度回调示例
*/
void ProgressCallback(uint64_t transferred_size, uint64_t total_size, void* user_data) {
qcloud_cos::ObjectReq* req = static_cast<qcloud_cos::ObjectReq*>(user_data);
if (0 == transferred_size % 1048576) {
std::cout << "ObjectName:" << req->GetObjectName() << ", TranferedSize:" << transferred_size << ",TotalSize:" << total_size << std::endl;
}
}
/*
* 该方法是异步下载对象的完成回调示例
*/
void GetObjectAsyncDoneCallback(const SharedAsyncContext& context, void* user_data) {
UNUSED_PARAM(user_data)
std::cout << "AsyncResumableGetObjectDemoCallback, BucketName:"
<< context->GetBucketName()
<< ", ObjectName:" << context->GetObjectName()
<< ", LocalFile:" << context->GetLocalFilePath() << std::endl;
// qcloud_cos::MultiGetObjectReq对应的响应为qcloud_cos::GetObjectByFileResp
if (context->GetResult().IsSucc()) {
// 获取响应
std::cout << "GetObject succeed" << std::endl;
std::cout << "Result:" << context->GetResult().DebugString() << std::endl;
AsyncResp resp = context->GetAsyncResp();
std::cout << "ETag:" << resp.GetEtag() << std::endl;
std::cout << "Crc64:" << resp.GetXCosHashCrc64Ecma() << std::endl;
} else {
std::cout << "GetObject failed" << std::endl;
std::cout << "ErrorMsg:" << context->GetResult().GetErrorMsg() << std::endl;
}
}

void AsyncResumableGetObjectDemo(qcloud_cos::CosAPI& cos) {
std::string local_file = "test_file/big_file.txt";
std::string object_name = "big_file.txt";
qcloud_cos::AsyncGetObjectReq req(bucket_name, object_name, local_file);
// 设置下载进度回调
req.SetTransferProgressCallback(&ProgressCallback);
// 设置下载状态回调
req.SetDoneCallback(&GetObjectAsyncDoneCallback);
// 设置私有数据,对应回调中的 user_data
req.SetUserData(&req);
// 开始下载
SharedAsyncContext context = cos.AsyncResumableGetObject(req);

std::cout << "===================AsyncResumableGetObject======================" << std::endl;
// 等待下载结束
std::cout << "wait finish..." << std::endl;
context->WaitUntilFinish();
// 检查结果
if (context->GetResult().IsSucc()) {
// 获取响应
std::cout << "AsyncResumableGetObject succeed" << std::endl;
std::cout << "Result:" << context->GetResult().DebugString() << std::endl;
AsyncResp resp = context->GetAsyncResp();
std::cout << "ETag:" << resp.GetEtag() << std::endl;
std::cout << "Crc64:" << resp.GetXCosHashCrc64Ecma() << std::endl;
} else {
std::cout << "AsyncResumableGetObject failed" << std::endl;
std::cout << "ErrorMsg:" << context->GetResult().GetErrorMsg() << std::endl;
}
std::cout << "================================================================" << std::endl;
}

参数说明

参数名称
描述
类型
req
下载文件请求
AsyncGetObjectReq
AsyncGetObjectReq 成员或函数说明:
成员或函数
描述
参数类型
bucket_name
存储桶名,可通过构造函数或 set 方法进行设置
存储桶的命名格式为 BucketName-APPID,详情请参见 命名规范
string
object_name
对象键(Key),可通过构造函数或 set 方法进行设置
是对象在存储桶中的唯一标识。例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键
string
local_file_path
本地文件路径,可通过构造函数或 set 方法进行设置
string
SetTransferProgressCallback
设置下载进度回调方法
TransferProgressCallback
SetDoneCallback
设置下载进度状态方法
DoneCallback
CosSysConfig 类用于进行相关的配置,在该样例中主要成员函数说明如下:
成员函数
描述
参数类型
SetAsynThreadPoolSize
设置异步线程池的大小,默认为2
设置方法为CosSysConfig::SetAsynThreadPoolSize(2)
unsigned

返回说明

context 主要成员函数说明如下:
成员函数
描述
返回类型
WaitUntilFinish
等待下载结束
GetResult
获取 Result 结果
CosResult
GetAsyncResp
获取 Resp 响应结果
AsyncResp
AsyncResp 主要成员函数说明如下:
成员函数
描述
返回类型
GetXCosHashCrc64Ecma
获取存储下载对象的 CRC64
string
GetEtag
获取存储下载对象的 Etag
string
GetXCosRequestId
获取请求 ID
string
CosResult 主要成员函数说明如下:
成员函数
描述
返回类型
IsSucc
判断是否成功,成功返回 true,失败返回 false
bool
GetHttpStatus
获取 http 状态码
int
GetErrorCode
获取请求失败时获取错误码
string
GetErrorMsg
获取请求失败时获取错误信息
string
GetXCosRequestId
获取请求 ID
string
对 CosResult 的使用样例如下,用户可根据信息选择使用:
void PrintResult(const qcloud_cos::CosResult& result, const qcloud_cos::BaseResp& resp) {
if (result.IsSucc()) {
std::cout << "Request Succ." << std::endl;
std::cout << resp.DebugString() << std::endl;
} else {
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
std::cout << "ResourceAddr=" << result.GetResourceAddr() << std::endl;
std::cout << "XCosRequestId=" << result.GetXCosRequestId() << std::endl;
std::cout << "XCosTraceId=" << result.GetXCosTraceId() << std::endl;
}
}

异步简单接口

前期准备:创建 CosAPI

调用 COS 的接口之前,必须先创建一个 CosAPI 的实例。这个实例用来后续调用请求。
qcloud_cos::CosAPI InitCosAPI() {
uint64_t appid = 12500000000;
std::string region = "ap-guangzhou";// bucket 的地域,请参见 https://cloud.tencent.com/document/product/436/62
std::string secret_id = "AKIDXXXXXXXX"; //用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
std::string secret_key = "1A2Z3YYYYYYYYYY"; //用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
qcloud_cos::CosConfig config(appid, secret_id, secret_key, region);
qcloud_cos::CosAPI cos_tmp(config);
return cos_tmp;
}

前期准备:使用临时密钥创建 CosAPI

如果要使用临时密钥请求 COS,则需要用临时密钥创建 CosAPI 实例。
qcloud_cos::CosAPI InitCosAPI() {
// 需要已经获取到临时密钥的结果:tmp_secret_id、tmp_secret_key、
// 临时密钥的生成参见 https://cloud.tencent.com/document/product/436/14048#cos-sts-sdk
uint64_t appid = 12500000000;
std::string region = "ap-guangzhou";
std::string tmp_secret_id = "AKIDXXXXXXXX";
std::string tmp_secret_key = "1A2Z3YYYYYYYYYY";
std::string tmp_token = "token";
qcloud_cos::CosConfig config(appid, tmp_secret_id, tmp_secret_key, region);
config.SetTmpToken(tmp_token);
qcloud_cos::CosAPI cos_tmp(config);
return cos_tmp;
}

使用案例:下载文件到本地

说明:
该 Demo 演示了如何使用 COS C++ SDK 异步简单下载对象到本地文件。
包含进度回调和下载状态回调的样例。

方法原型

SharedAsyncContext CosAPI::AsyncGetObject(const AsyncGetObjectReq& req)

请求示例

/*
* 该方法是异步下载对象的进度回调示例
*/
void ProgressCallback(uint64_t transferred_size, uint64_t total_size, void* user_data) {
qcloud_cos::ObjectReq* req = static_cast<qcloud_cos::ObjectReq*>(user_data);
if (0 == transferred_size % 1048576) {
std::cout << "ObjectName:" << req->GetObjectName() << ", TranferedSize:" << transferred_size << ",TotalSize:" << total_size << std::endl;
}
}
/*
* 该方法是异步下载对象的完成回调示例
*/
void GetObjectAsyncDoneCallback(const SharedAsyncContext& context, void* user_data) {
UNUSED_PARAM(user_data)
std::cout << "AsyncGetObjectDemoCallback, BucketName:"
<< context->GetBucketName()
<< ", ObjectName:" << context->GetObjectName()
<< ", LocalFile:" << context->GetLocalFilePath() << std::endl;
// qcloud_cos::MultiGetObjectReq对应的响应为qcloud_cos::GetObjectByFileResp
if (context->GetResult().IsSucc()) {
// 获取响应
std::cout << "GetObject succeed" << std::endl;
std::cout << "Result:" << context->GetResult().DebugString() << std::endl;
AsyncResp resp = context->GetAsyncResp();
std::cout << "ETag:" << resp.GetEtag() << std::endl;
std::cout << "Crc64:" << resp.GetXCosHashCrc64Ecma() << std::endl;
} else {
std::cout << "GetObject failed" << std::endl;
std::cout << "ErrorMsg:" << context->GetResult().GetErrorMsg() << std::endl;
}
}

void AsyncGetObjectDemo(qcloud_cos::CosAPI& cos) {
std::string local_file = "test_file/text.txt";
std::string object_name = "text.txt";
qcloud_cos::AsyncGetObjectReq req(bucket_name, object_name, local_file);
req.SetRecvTimeoutInms(1000 * 60);
// 设置下载进度回调
req.SetTransferProgressCallback(&ProgressCallback);
// 设置下载状态回调
req.SetDoneCallback(&GetObjectAsyncDoneCallback);
// 设置私有数据,对应回调中的 user_data
req.SetUserData(&req);
// 开始下载
SharedAsyncContext context = cos.AsyncGetObject(req);
std::cout << "===================AsyncGetObject======================" << std::endl;
// 等待下载结束
std::cout << "wait finish..." << std::endl;
context->WaitUntilFinish();
// 检查结果
if (context->GetResult().IsSucc()) {
// 获取响应
std::cout << "AsyncGetObject succeed" << std::endl;
std::cout << "Result:" << context->GetResult().DebugString() << std::endl;
AsyncResp resp = context->GetAsyncResp();
std::cout << "ETag:" << resp.GetEtag() << std::endl;
std::cout << "Crc64:" << resp.GetXCosHashCrc64Ecma() << std::endl;
} else {
std::cout << "AsyncGetObject failed" << std::endl;
std::cout << "ErrorMsg:" << context->GetResult().GetErrorMsg() << std::endl;
}
std::cout << "=======================================================" << std::endl;
}

参数说明

参数名称
描述
类型
req
下载文件请求
AsyncGetObjectReq
AsyncGetObjectReq 成员或函数说明:
成员或函数
描述
参数类型
bucket_name
存储桶名,可通过构造函数或 set 方法进行设置
存储桶的命名格式为 BucketName-APPID,详情请参见 命名规范
string
object_name
对象键(Key),可通过构造函数或 set 方法进行设置
是对象在存储桶中的唯一标识。例如,在对象的访问域名 examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com/doc/picture.jpg 中,对象键为 doc/picture.jpg,详情请参见 对象键
string
local_file_path
本地文件路径,可通过构造函数或 set 方法进行设置
string
SetTransferProgressCallback
设置下载进度回调方法
TransferProgressCallback
SetDoneCallback
设置下载进度状态方法
DoneCallback

返回说明

context 主要成员函数说明如下:
成员函数
描述
返回类型
WaitUntilFinish
等待下载结束
GetResult
获取 Result 结果
CosResult
GetAsyncResp
获取 Resp 响应结果
AsyncResp
AsyncResp 主要成员函数说明如下:
成员函数
描述
返回类型
GetXCosHashCrc64Ecma
获取存储下载对象的 CRC64
string
GetEtag
获取存储下载对象的 Etag
string
GetXCosRequestId
获取请求 ID
string
CosResult 主要成员函数说明如下:
成员函数
描述
返回类型
IsSucc
判断是否成功,成功返回 true,失败返回 false。
bool
GetHttpStatus
获得 http 状态码。
int
GetErrorCode
请求失败时获取错误码。
string
GetErrorMsg
请求失败时获取错误信息。
string
GetXCosRequestId
获取请求 ID。
string
对 CosResult 的使用样例如下,用户可根据信息选择使用:
void PrintResult(const qcloud_cos::CosResult& result, const qcloud_cos::BaseResp& resp) {
if (result.IsSucc()) {
std::cout << "Request Succ." << std::endl;
std::cout << resp.DebugString() << std::endl;
} else {
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
std::cout << "HttpStatus=" << result.GetHttpStatus() << std::endl;
std::cout << "ErrorCode=" << result.GetErrorCode() << std::endl;
std::cout << "ErrorMsg=" << result.GetErrorMsg() << std::endl;
std::cout << "ResourceAddr=" << result.GetResourceAddr() << std::endl;
std::cout << "XCosRequestId=" << result.GetXCosRequestId() << std::endl;
std::cout << "XCosTraceId=" << result.GetXCosTraceId() << std::endl;
}
}

API 操作

关于下载对象接口涉及的 API 接口说明,请参见 GET Object 查看。