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
聚焦模式
字号
最后更新时间: 2026-03-05 16:54:12

简介

本文介绍对象存储 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://www.tencentcloud.com/document/product/436/62?from_cn_redirect=1
std::string secret_id = "************************************"; //用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1
std::string secret_key = "************************************"; //用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1
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://www.tencentcloud.com/document/product/436/14048?from_cn_redirect=1#cos-sts-sdk
uint64_t appid = 12500000000;
std::string region = "ap-guangzhou";
std::string tmp_secret_id = "************************************";
std::string tmp_secret_key = "************************************";
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://www.tencentcloud.com/document/product/436/62?from_cn_redirect=1
std::string secret_id = "************************************"; //用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1
std::string secret_key = "************************************"; //用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1
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://www.tencentcloud.com/document/product/436/14048?from_cn_redirect=1#cos-sts-sdk
uint64_t appid = 12500000000;
std::string region = "ap-guangzhou";
std::string tmp_secret_id = "************************************";
std::string tmp_secret_key = "************************************";
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://www.tencentcloud.com/document/product/436/62?from_cn_redirect=1
std::string secret_id = "************************************"; //用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1
std::string secret_key = "************************************"; //用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1
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://www.tencentcloud.com/document/product/436/14048?from_cn_redirect=1#cos-sts-sdk
uint64_t appid = 12500000000;
std::string region = "ap-guangzhou";
std::string tmp_secret_id = "************************************";
std::string tmp_secret_key = "************************************";
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://www.tencentcloud.com/document/product/436/62?from_cn_redirect=1
std::string secret_id = "************************************"; //用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1
std::string secret_key = "************************************"; //用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://www.tencentcloud.com/document/product/598/37140?from_cn_redirect=1
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://www.tencentcloud.com/document/product/436/14048?from_cn_redirect=1#cos-sts-sdk
uint64_t appid = 12500000000;
std::string region = "ap-guangzhou";
std::string tmp_secret_id = "************************************";
std::string tmp_secret_key = "************************************";
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 查看。

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈