对象元信息是对象的属性描述,包括 HTTP 标准属性(HTTP Header)和用户自定义元数据(User Meta)两种。
注意
您可以设置对象元信息,用于标识对象的用途或属性,以下代码用于设置对象的元数据。
#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); // 需要上传的对象数据,以 stringstream 的形式上传 std::string data("Object data to be uploaded"); auto ss = std::make_shared<std::stringstream>(data); PutObjectV2Input input(bucketName, objectName, ss); // 如果需要设置对象元数据,可按如下设置 // 设置 ACL 为 PublicRead input.setAcl(ACLType::PublicRead); // 设置 StorageClass 为 IA input.setStorageClass(StorageClassType::IA); // 设置对象元数据 input.setMeta({{"self-test", "yes"}}); // 设置ContentType input.setContentType("application/json"); auto output = client.putObject(input); if (!output.isSuccess()) { // 异常处理 std::cout << "PutObjectWithMetaData failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "PutObjectWithMetaData success. the object etag:" << output.result().getETag() << std::endl; // 释放网络等资源 CloseClient(); return 0; }
#include "TosClientV2.h" using namespace VolcengineTos; static int64_t getFileSize(const std::string& file) { std::fstream f(file, std::ios::in | std::ios::binary); f.seekg(0, f.end); int64_t size = f.tellg(); f.close(); return size; } 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); // 初始化分片上传事件 CreateMultipartUploadInput input(bucketName, objectName); // 可以指定 ACL,StorageClass,用户自定义元数据等 input.setAcl(ACLType::PublicRead); input.setStorageClass(StorageClassType::IA); input.setMeta({{"self-test", "yes"}}); auto upload = client.createMultipartUpload(input); if (!upload.isSuccess()) { // 异常处理 std::cout << "createMultipartUpload failed." << upload.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "createMultipartUpload success." << std::endl; // 准备上传的文件 std::string fileToUpload = "yourLocalFilename"; int64_t partSize = 100 * 1024; std::vector<UploadedPartV2> partResList; auto fileSize = getFileSize(fileToUpload); int partCount = static_cast<int>(fileSize / partSize); // 计算分片个数 if (fileSize % partSize != 0) { partCount++; } // 对每一个分片进行上传 auto uploadId = upload.result().getUploadId(); for (int i = 1; i <= partCount; i++) { auto offset = partSize * (i - 1); auto size = (partSize < fileSize - offset) ? partSize : (fileSize - offset); std::shared_ptr<std::iostream> content = std::make_shared<std::fstream>(fileToUpload, std::ios::in|std::ios::binary); content->seekg(offset, std::ios::beg); UploadPartV2Input uploadPartInput(bucketName, objectName,uploadId, size,i,content); auto uploadPartOutput = client.uploadPart(uploadPartInput); if (!uploadPartOutput.isSuccess()) { std::cout << "uploadPart failed." << upload.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } UploadedPartV2 part(i, uploadPartOutput.result().getETag()); partResList.push_back(part); } // 完成分片上传 CompleteMultipartUploadV2Input completeMultipartUploadInput(bucketName, objectName, uploadId, partResList); auto com = client.completeMultipartUpload(completeMultipartUploadInput); if (com.isSuccess()) { // 异常处理 std::cout << "CompleteMultipartUpload failed." << upload.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "CompleteMultipartUpload success." << com.result().getRequestInfo().getRequestId() << 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); SetObjectMetaInput input(bucketName,objectName); // 如果需要设置对象元数据,可按如下设置 input.setMeta({{"self-test", "yes"}}); auto output = client.setObjectMeta(input); if (!output.isSuccess()) { // 异常处理 std::cout << "SetObjectMeta failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "SetObjectMeta success." << std::endl; // 释放网络等资源 CloseClient(); return 0; }
关于设置对象元数据的 API 文档,请参见 SetObjectMeta。
注意
获取对象元数据,您必须具备 tos:GetObject
权限,具体操作请参见 IAM 策略概述。
您可以通过 headObject 获取对象元信息,以下代用于获取对象的元数据。
#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); HeadObjectV2Input input(bucketName,objectName); auto output = client.headObject(input); if (!output.isSuccess()) { // 异常处理 std::cout << "HeadObject failed." << output.error().String() << std::endl; // 释放网络等资源 CloseClient(); return -1; } std::cout << "HeadObject success." << std::endl; std::cout << output.result().getStringFormatStorageClass() << "," << output.result().getContentDisposition() << "," << output.result().getContentType() << "," << output.result().getContentLength() << std::endl; for(const auto& meta : output.result().getMeta()){ std::cout << meta.first << "," << meta.second << std::endl; } // 释放网络等资源 CloseClient(); return 0; }
关于查询对象元数据的 API 文档,请参见 HeadObject。