追加上传创建的对象类型为追加类型 (Appendable Object) ,可在对象末尾追加写入数据。而普通上传和分片上传创建的对象类型为普通类型 (Normal Object),无法追加写入数据。
tos:PutObject
权限,具体操作请参见权限配置指南。使用 appendObject 接口时,对象的大小限制说明如下:
以下代码用于将内存中的字符串追加上传到目标桶 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); // 第一次追加的位置是0,返回值为下一次追加的位置。后续追加的位置是追加前文件的长度。 auto part0 = std::make_shared<std::stringstream>(); for (int i = 0; i < (128 << 10); ++i) { *part0 << "1"; } AppendObjectV2Input input(bucketName, objectName, part0, 0); auto output = client.appendObject(input); if (!output.isSuccess()) { // 异常处理 std::cout << "AppendObject failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "AppendObject success." << std::endl; std::cout << "Next Append Offset is: " << output.result().getNextAppendOffset() << std::endl; std::cout << "Pre HashCrc64Ecma is: " << output.result().getHashCrc64ecma() << std::endl; auto part1 = std::make_shared<std::stringstream>(); for (int i = 0; i < (256 << 10); ++i) { *part1 << "1"; } input.setContent(part1); // 从第一次追加的返回结果中,获取后续追加的位置offset和用于计算Crc64的PreHashCrc64Ecma input.setOffset(output.result().getNextAppendOffset()); input.setPreHashCrc64Ecma(output.result().getHashCrc64ecma()); auto output1 = client.appendObject(input); if (!output.isSuccess()) { // 异常处理 std::cout << "AppendObject failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "AppendObject success." << std::endl; std::cout << "Next Append Offset is: " << output1.result().getNextAppendOffset() << std::endl; std::cout << "Pre HashCrc64Ecma is: " << output1.result().getHashCrc64ecma() << 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); // 第一次追加的位置是0,返回值为下一次追加的位置。后续追加的位置是追加前文件的长度。 auto part0 = std::make_shared<std::stringstream>(); for (int i = 0; i < (128 << 10); ++i) { *part0 << "1"; } AppendObjectV2Input input(bucketName, objectName, part0, 0); // 设置进度条 DataTransferListener datatransferlistener = {ProgressCallback, nullptr}; input.setDataTransferListener(datatransferlistener); auto output = client.appendObject(input); if (!output.isSuccess()) { // 异常处理 std::cout << "AppendObject failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "AppendObject success." << std::endl; std::cout << "Next Append Offset is: " << output.result().getNextAppendOffset() << std::endl; std::cout << "Pre HashCrc64Ecma is: " << output.result().getHashCrc64ecma() << std::endl; auto part1 = std::make_shared<std::stringstream>(); for (int i = 0; i < (256 << 10); ++i) { *part1 << "1"; } input.setContent(part1); // 从第一次追加的返回结果中,获取后续追加的位置offset和用于计算Crc64的PreHashCrc64Ecma input.setOffset(output.result().getNextAppendOffset()); input.setPreHashCrc64Ecma(output.result().getHashCrc64ecma()); auto output1 = client.appendObject(input); if (!output.isSuccess()) { // 异常处理 std::cout << "AppendObject failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "AppendObject success." << std::endl; std::cout << "Next Append Offset is: " << output1.result().getNextAppendOffset() << std::endl; std::cout << "Pre HashCrc64Ecma is: " << output1.result().getHashCrc64ecma() << 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); // 第一次追加的位置是0,返回值为下一次追加的位置。后续追加的位置是追加前文件的长度。 auto part0 = std::make_shared<std::stringstream>(); for (int i = 0; i < (128 << 10); ++i) { *part0 << "1"; } AppendObjectV2Input input(bucketName, objectName, part0, 0); // 设置客户端限速 std::shared_ptr<RateLimiter> RateLimiter(NewRateLimiter(1024 * 1024, 1024 * 1024)); input.setRateLimiter(RateLimiter); auto output = client.appendObject(input); if (!output.isSuccess()) { // 异常处理 std::cout << "AppendObject failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "AppendObject success." << std::endl; std::cout << "Next Append Offset is: " << output.result().getNextAppendOffset() << std::endl; std::cout << "Pre HashCrc64Ecma is: " << output.result().getHashCrc64ecma() << std::endl; auto part1 = std::make_shared<std::stringstream>(); for (int i = 0; i < (256 << 10); ++i) { *part1 << "1"; } input.setContent(part1); // 从第一次追加的返回结果中,获取后续追加的位置offset和用于计算Crc64的PreHashCrc64Ecma input.setOffset(output.result().getNextAppendOffset()); input.setPreHashCrc64Ecma(output.result().getHashCrc64ecma()); auto output1 = client.appendObject(input); if (!output.isSuccess()) { // 异常处理 std::cout << "AppendObject failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "AppendObject success." << std::endl; std::cout << "Next Append Offset is: " << output1.result().getNextAppendOffset() << std::endl; std::cout << "Pre HashCrc64Ecma is: " << output1.result().getHashCrc64ecma() << std::endl; // 释放网络等资源 CloseClient(); return 0; }
关于追加上传的 API 文档,请参见 AppendObject。