如果您只需获取对象中的部分数据,您可以使用范围下载,下载指定范围内的数据,本文介绍范围下载的示例代码。
tos:GetObject
权限,具体操作,请参见权限配置指南。tos:GetObjectVersion
权限,具体操作,请参见权限配置指南。以下代码用于指定指定 RangeStart/RangeEnd 下载桶 examplebucket
中的对象 exampledir/exampleobject.txt
的部分数据。
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 std::string objectName = "exampledir/exampleobject.txt"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); GetObjectV2Input input(bucketName, objectName); // 指定对象的获取范围。如未指定,则获取整个对象。Range是一个范围,它的起始值最小为0,最大为对象长度减1。 // Range范围的起始值为必填项,如果Range只包含起始值,表示获取起始值到对象长度减1这个区间的对象内容。 // 指定范围为 bytes=0-1000 input.setRangeStart(0); input.setRangeEnd(1000); auto output = client.getObject(input); if (!output.isSuccess()) { // 异常处理 std::cout << "GetObject failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "GetObject success. the object etag:" << output.result().getETags() << std::endl; // 释放网络等资源 CloseClient(); return 0; }
以下代码用于范围下载时配置进度条。
#include "TosClientV2.h" using namespace VolcengineTos; static void ProgressCallback(std::shared_ptr<DataTransferStatus> datatransferstatus) { int64_t consumedBytes = datatransferstatus->consumedBytes_; int64_t totalBytes = datatransferstatus->totalBytes_; int64_t rwOnceBytes = datatransferstatus->rwOnceBytes_; DataTransferType type = datatransferstatus->type_; int64_t rate = 100 * consumedBytes / totalBytes; std::cout << "rate:" << rate << "," << "ConsumedBytes:" << consumedBytes << "," << "totalBytes:" << totalBytes << "," << "rwOnceBytes:" << rwOnceBytes << "," << "DataTransferType:" << type << std::endl; } int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 std::string objectName = "exampledir/exampleobject.txt"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); GetObjectV2Input input(bucketName, objectName); // 指定范围为 bytes=0-1000 input.setRangeStart(0); input.setRangeEnd(1000); // 设置进度条 DataTransferListener processHandler = {ProgressCallback, nullptr}; input.setDataTransferListener(processHandler); auto output = client.getObject(input); if (!output.isSuccess()) { // 异常处理 std::cout << "GetObject failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "GetObject success. the object etag:" << output.result().getETags() << std::endl; // 释放网络等资源 CloseClient(); return 0; }
以下代码用于范围下载时配置客户端限速。
#include "TosClientV2.h" using namespace VolcengineTos; int main(void){ // 初始化 TOS 账号信息 // Your Region 填写 Bucket 所在 Region std::string region = "Your Region"; std::string accessKey = std::getenv("TOS_ACCESS_KEY"); std::string secretKey = std::getenv("TOS_SECRET_KEY"); // 填写 Bucket 名称,例如 examplebucket std::string bucketName = "examplebucket"; // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 std::string objectName = "exampledir/exampleobject.txt"; // 初始化网络等资源 InitializeClient(); // 创建交互的 client TosClientV2 client(region, accessKey, secretKey); GetObjectV2Input input(bucketName, objectName); // 指定范围为 bytes=0-1000 input.setRangeStart(0); input.setRangeEnd(1000); // 设置 rateLimiter std::shared_ptr<RateLimiter> RateLimiter(NewRateLimiter(20 * 1024 * 1024, 5 * 1024 * 1024)); input.setRateLimiter(RateLimiter); auto output = client.getObject(input); if (!output.isSuccess()) { // 异常处理 std::cout << "GetObject failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "GetObject success. the object etag:" << output.result().getETags() << std::endl; // 释放网络等资源 CloseClient(); return 0; }
关于下载对象的 API 文档,请参见 GetObject。