Object Storage Service (OSS) allows you to configure object tags to classify objects. Tags allow you to configure lifecycle rules and access control lists (ACLs) for objects that have the same tag.
Note For more information about object tags, see Object tagging.
Usage notes
- In this topic, the public endpoint of the China (Hangzhou) region is used. If you want to access OSS by using other Alibaba Cloud services in the same region as OSS, use an internal endpoint For more information about the regions and endpoints supported by OSS, see Regions and endpoints.
- In this topic, an OSSClient instance is created by using an OSS endpoint. If you want to create an OSSClient instance by using custom domain names or STS, see Create an OSSClient instance.
- To configure object tagging, you must have the
oss:PutObjectTagging
permission. For more information, see Attach a custom policy to a RAM user.
Add tags to an object when you upload the object
- Add tags to an object when you upload the object by using simple upload The following code provides an example on how to add tags to an object when you upload the object by using simple upload:
#include <alibabacloud/oss/OssClient.h> using namespace AlibabaCloud::OSS; int main(void) { /* Initialize information about the account that is used to access OSS. */ /* The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. Using these credentials to perform operations in OSS is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M. To create a RAM user, log on to the RAM console. */ std::string AccessKeyId = "yourAccessKeyId"; std::string AccessKeySecret = "yourAccessKeySecret"; /* Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. */ std::string Endpoint = "yourEndpoint"; /* Specify the name of the bucket. Example: examplebucket. */ std::string BucketName = "examplebucket"; /* Specify the full path of the object. Do not include the bucket name in the full path. Example: exampledir/exampleobject.txt. */ std::string ObjectName = "exampledir/exampleobject.txt"; /* Initialize resources, such as network resources. */ InitializeSdk(); ClientConfiguration conf; OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf); std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>(); *content << "test cpp sdk"; PutObjectRequest request(BucketName, ObjectName, content); /* Specify the tags. */ Tagging tagging; tagging.addTag(Tag("key1", "value1")); tagging.addTag(Tag("key2", "value2")); request.setTagging(tagging.toQueryParameters()); /* Upload the object. */ auto outcome = client.PutObject(request); if (!outcome.isSuccess()) { /* Handle exceptions. */ std::cout << "PutObject fail" << ",code:" << outcome.error().Code() << ",message:" << outcome.error().Message() << ",requestId:" << outcome.error().RequestId() << std::endl; return -1; } /* Release resources, such as network resources. */ ShutdownSdk(); return 0; }
- Add tags to an object when you upload the object by using multipart upload The following code provides an example on how to add tags to an object when you upload the object by using multipart upload:
#include <alibabacloud/oss/OssClient.h> 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; } using namespace AlibabaCloud::OSS; int main(void) { /* Initialize information about the account that is used to access OSS. */ /* The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. Using these credentials to perform operations in OSS is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M. To create a RAM user, log on to the RAM console. */ std::string AccessKeyId = "yourAccessKeyId"; std::string AccessKeySecret = "yourAccessKeySecret"; /* Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. */ std::string Endpoint = "yourEndpoint"; /* Specify the name of the bucket. Example: examplebucket. */ std::string BucketName = "examplebucket"; /* Specify the full path of the object. Do not include the bucket name in the full path. Example: exampledir/exampleobject.txt. */ std::string ObjectName = "exampledir/exampleobject.txt"; /* Initialize resources, such as network resources. */ InitializeSdk(); ClientConfiguration conf; OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf); InitiateMultipartUploadRequest initUploadRequest(BucketName, ObjectName); /* Specify the tags. */ Tagging tagging; tagging.addTag(Tag("key1", "value1")); tagging.addTag(Tag("key2", "value2")); initUploadRequest.setTagging(tagging.toQueryParameters()); /* Initiate a multipart upload task. */ auto uploadIdResult = client.InitiateMultipartUpload(initUploadRequest); auto uploadId = uploadIdResult.result().UploadId(); std::string fileToUpload = "yourLocalFilename"; int64_t partSize = 100 * 1024; PartList partETagList; auto fileSize = getFileSize(fileToUpload); int partCount = static_cast<int>(fileSize / partSize); /* Calculate the number of parts. */ if (fileSize % partSize != 0) { partCount++; } /* Upload each part. */ for (int i = 1; i <= partCount; i++) { auto skipBytes = partSize * (i - 1); auto size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes); std::shared_ptr<std::iostream> content = std::make_shared<std::fstream>(fileToUpload, std::ios::in|std::ios::binary); content->seekg(skipBytes, std::ios::beg); UploadPartRequest uploadPartRequest(BucketName, ObjectName, content); uploadPartRequest.setContentLength(size); uploadPartRequest.setUploadId(uploadId); uploadPartRequest.setPartNumber(i); auto uploadPartOutcome = client.UploadPart(uploadPartRequest); if (uploadPartOutcome.isSuccess()) { Part part(i, uploadPartOutcome.result().ETag()); partETagList.push_back(part); } else { std::cout << "uploadPart fail" << ",code:" << uploadPartOutcome.error().Code() << ",message:" << uploadPartOutcome.error().Message() << ",requestId:" << uploadPartOutcome.error().RequestId() << std::endl; } } /* Complete the multipart upload task. */ CompleteMultipartUploadRequest request(BucketName, ObjectName); request.setUploadId(uploadId); request.setPartList(partETagList); auto outcome = client.CompleteMultipartUpload(request); if (!outcome.isSuccess()) { /* Handle exceptions. */ std::cout << "CompleteMultipartUpload fail" << ",code:" << outcome.error().Code() << ",message:" << outcome.error().Message() << ",requestId:" << outcome.error().RequestId() << std::endl; return -1; } /* Release resources, such as network resources. */ ShutdownSdk(); return 0; }
- Add tags to an object when you upload the object by using append upload The following code provides an example on how to add tags to an object when you upload the object by using append upload:
#include <alibabacloud/oss/OssClient.h> using namespace AlibabaCloud::OSS; int main(void) { /* Initialize information about the account that is used to access OSS. */ /* The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. Using these credentials to perform operations in OSS is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M. To create a RAM user, log on to the RAM console. */ std::string AccessKeyId = "yourAccessKeyId"; std::string AccessKeySecret = "yourAccessKeySecret"; /* Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. */ std::string Endpoint = "yourEndpoint"; /* Specify the name of the bucket. Example: examplebucket. */ std::string BucketName = "examplebucket"; /* Specify the full path of the object. Do not include the bucket name in the full path. Example: exampledir/exampleobject.txt. */ std::string ObjectName = "exampledir/exampleobject.txt"; /* Initialize resources, such as network resources. */ InitializeSdk(); ClientConfiguration conf; OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf); auto meta = ObjectMetaData(); meta.setContentType("text/plain"); /* Append data to the object. The default position from which the append operation starts is 0. */ std::shared_ptr<std::iostream> content1 = std::make_shared<std::stringstream>(); *content1 <<"Thank you for using Aliyun Object Storage Service!"; AppendObjectRequest request(BucketName, ObjectName, content1, meta); /* Specify the tags. */ Tagging tagging; tagging.addTag(Tag("key1", "value1")); tagging.addTag(Tag("key2", "value2")); request.setTagging(tagging.toQueryParameters()); /* Perform the append operation. */ auto result = client.AppendObject(request); if (!result.isSuccess()) { /* Handle exceptions. */ std::cout << "AppendObject fail" << ",code:" << result.error().Code() << ",message:" << result.error().Message() << ",requestId:" << result.error().RequestId() << std::endl; return -1; } /* Release resources, such as network resources. */ ShutdownSdk(); return 0; }
- Add tags to an object when you upload the object by using resumable upload The following code provides an example on how to add tags to an object when you upload the object by using resumable upload:
#include <alibabacloud/oss/OssClient.h> using namespace AlibabaCloud::OSS; int main(void) { /* Initialize information about the account that is used to access OSS. */ /* The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. Using these credentials to perform operations in OSS is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M. To create a RAM user, log on to the RAM console. */ std::string AccessKeyId = "yourAccessKeyId"; std::string AccessKeySecret = "yourAccessKeySecret"; /* Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. */ std::string Endpoint = "yourEndpoint"; /* Specify the name of the bucket. Example: examplebucket. */ std::string BucketName = "examplebucket"; /* Specify the full path of the object. Do not include the bucket name in the full path. Example: exampledir/exampleobject.txt. */ std::string ObjectName = "exampledir/exampleobject.txt"; std::string UploadFilePath = "yourUploadfilePath"; /* Initialize resources such as network resources. */ InitializeSdk(); ClientConfiguration conf; OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf); /* Start resumable upload. */ UploadObjectRequest request(BucketName, ObjectName, YourUploadFileName); /* Specify the tags that you want to add to the object. */ Tagging tagging; tagging.addTag(Tag("key1", "value1")); tagging.addTag(Tag("key2", "value2")); request.setTagging(tagging.toQueryParameters()); auto outcome = client.ResumableUploadObject(request); if (!outcome.isSuccess()) { /* Handle exceptions. */ std::cout << "ResumableUploadObject fail" << ",code:" << outcome.error().Code() << ",message:" << outcome.error().Message() << ",requestId:" << outcome.error().RequestId() << std::endl; return -1; } /* Release resources such as network resources. */ ShutdownSdk(); return 0; }
Add tags to an uploaded object or modify the tags of the object
The following code provides an example on how to add tags to an uploaded object or modify the tags of the object:
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Initialize information about the account that is used to access OSS. */
/* The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. Using these credentials to perform operations in OSS is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M. To create a RAM user, log on to the RAM console. */
std::string AccessKeyId = "yourAccessKeyId";
std::string AccessKeySecret = "yourAccessKeySecret";
/* Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Specify the name of the bucket. Example: examplebucket. */
std::string BucketName = "examplebucket";
/* Specify the full path of the object. Do not include the bucket name in the full path. Example: exampledir/exampleobject.txt. */
std::string ObjectName = "exampledir/exampleobject.txt";
/* Initialize resources, such as network resources. */
InitializeSdk();
ClientConfiguration conf;
OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>();
*content << "test cpp sdk";
PutObjectRequest request(BucketName, ObjectName, content);
/* Upload the object. */
auto outcome = client.PutObject(request);
/* Specify the tags. */
Tagging tagging;
tagging.addTag(Tag("key1", "value1"));
tagging.addTag(Tag("key2", "value2"));
auto putTaggingOutcome = client.SetObjectTagging(SetObjectTaggingRequest(BucketName, ObjectName, tagging));
if (!putTaggingOutcome.isSuccess()) {
/* Handle exceptions. */
std::cout << "SetObjectTagging fail" <<
",code:" << putTaggingOutcome.error().Code() <<
",message:" << putTaggingOutcome.error().Message() <<
",requestId:" << putTaggingOutcome.error().RequestId() << std::endl;
return -1;
}
/* Release resources, such as network resources. */
ShutdownSdk();
return 0;
}
Add tags to an object when you copy the object
You can use the one of following methods to configure the object tagging when you copy an object: Valid values:
- Copy: The tag of the source object is copied to the destination object.
- Replace: The tag of the destination object is set to the tag specified in the request instead of the tag of the source object.
The following examples describe how to add tags to an object smaller than 1 GB in simple copy mode and larger than 1 GB in multipart copy mode:
- The following code provides an example on how to add tags to an object smaller than 1 GB in size when you copy the object by using simple copy:
#include <alibabacloud/oss/OssClient.h> using namespace AlibabaCloud::OSS; int main(void) { /* Initialize information about the account that is used to access OSS. */ /* The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. Using these credentials to perform operations in OSS is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M. To create a RAM user, log on to the RAM console. */ std::string AccessKeyId = "yourAccessKeyId"; std::string AccessKeySecret = "yourAccessKeySecret"; /* Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. */ std::string Endpoint = "yourEndpoint"; /* Specify the name of the bucket. Example: examplebucket. */ std::string BucketName = "examplebucket"; /* Specify the full path of the destination object. Do not include the bucket name in the full path. Example: exampledir/exampleobject.txt. */ std::string ObjectName = "exampledir/exampleobject.txt"; /* Specify the full path of the source object. std::string CopyObjectName = "scrdir/scrobject.txt"; /* Initialize resources, such as network resources. */ InitializeSdk(); ClientConfiguration conf; OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf); std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>(); *content << "test cpp sdk"; PutObjectRequest request(BucketName, ObjectName, content); /* Specify the tags. */ Tagging tagging; tagging.addTag(Tag("key1", "value1")); tagging.addTag(Tag("key2", "value2")); request.setTagging(tagging.toQueryParameters()); /* Upload the object. */ auto outcome = client.PutObject(request); /* Specify the tags that you want to add to the object when you copy the object. */ CopyObjectRequest cpRequest(yourBucketName, CopyObjectName); cpRequest.setCopySource(yourBucketName, yourObjectName); Tagging tagging2; tagging2.addTag(Tag("key1-2", "value1-2")); tagging2.addTag(Tag("key2-2", "value2-2")); tagging2.addTag(Tag("key3-2", "value3-2")); cpRequest.setTagging(tagging2.toQueryParameters()); /* Replace the tags of the destination object with the specified tags in the request. */ cpRequest.setTaggingDirective(CopyActionList::Replace); /* Copy the object. */ auto copyoutcome = client.CopyObject(cpRequest); if (!copyoutcome.isSuccess()) { /* Handle exceptions. */ std::cout << "CopyObject fail" << ",code:" << copyoutcome.error().Code() << ",message:" << copyoutcome.error().Message() << ",requestId:" << copyoutcome.error().RequestId() << std::endl; return -1; } /* Release resources, such as network resources. */ ShutdownSdk(); return 0; }
- The following code provides an example on how to add tags to an object larger than 1 GB in size when you copy the object by using multipart copy:
#include <alibabacloud/oss/OssClient.h> #include <sstream> using namespace AlibabaCloud::OSS; int main(void) { /* Initialize information about the account that is used to access OSS. */ /* The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. Using these credentials to perform operations in OSS is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M. To create a RAM user, log on to the RAM console. */ std::string AccessKeyId = "yourAccessKeyId"; std::string AccessKeySecret = "yourAccessKeySecret"; /* Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. */ std::string Endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; /* Specify the name of the source bucket. Example: srcexamplebucket. */ std::string SourceBucketName = "srcexamplebucket"; /* Specify the name of the destination bucket. The destination bucket must be located in the same region as the source bucket. Example: destbucket. */ std::string CopyBucketName = "destbucket"; /* Specify the full path of the source object. Do not include the bucket name in the full path. Example: srcdir/scrobject.txt. */ std::string SourceObjectName = "srcdir/scrobject.txt"; /* Specify the full path of the destination object. Do not include the bucket name in the full path. Example: destdir/destobject.txt. */ std::string CopyObjectName = "destdir/destobject.txt"; /* Initialize resources, such as network resources. */ InitializeSdk(); ClientConfiguration conf; OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf); auto getObjectMetaReq = GetObjectMetaRequest(SourceBucketName, SourceObjectName); auto getObjectMetaResult = GetObjectMeta(getObjectMetaReq); if (!getObjectMetaResult.isSuccess()) { std::cout << "GetObjectMeta fail" << ",code:" << outcome.error().Code() << ",message:" << outcome.error().Message() << ",requestId:" << outcome.error().RequestId() << std::endl; return -1; } /* Query the size of the object that you want to copy. */ auto objectSize = getObjectMetaResult.result().ContentLength(); /* Copy the large object. */ ObjectMetaData metaData; std::stringstream ssDesc; ssDesc << "/" << SourceBucketName << "/" << SourceObjectName; std::string value = ssDesc.str(); metaData.addHeader("x-oss-copy-source", value); InitiateMultipartUploadRequest initUploadRequest(BucketName, ObjectName, metaData); /* Specify the tags. */ Tagging tagging; tagging.addTag(Tag("key1", "value1")); tagging.addTag(Tag("key2", "value2")); initUploadRequest.setTagging(tagging.toQueryParameters()); /* Initiate a multipart copy task. */ auto uploadIdResult = client.InitiateMultipartUpload(initUploadRequest); auto uploadId = uploadIdResult.result().UploadId(); int64_t partSize = 100 * 1024; PartList partETagList; int partCount = static_cast<int>(objectSize / partSize); /* Calculate the number of parts. */ if (objectSize % partSize != 0) { partCount++; } /* Copy each part. */ for (int i = 1; i <= partCount; i++) { auto skipBytes = partSize * (i - 1); auto size = (partSize < objectSize - skipBytes) ? partSize : (objectSize - skipBytes); auto uploadPartCopyReq = UploadPartCopyRequest(CopyBucketName, CopyObjectName, SourceBucketName, SourceObjectName,uploadId, i + 1); uploadPartCopyReq.setCopySourceRange(skipBytes, skipBytes + size -1); auto uploadPartOutcome = client.UploadPartCopy(uploadPartCopyReq); if (uploadPartOutcome.isSuccess()) { Part part(i, uploadPartOutcome.result().ETag()); partETagList.push_back(part); } else { std::cout << "UploadPartCopy fail" << ",code:" << outcome.error().Code() << ",message:" << outcome.error().Message() << ",requestId:" << outcome.error().RequestId() << std::endl; } } /* Complete the multipart copy task. */ CompleteMultipartUploadRequest request(CopyBucketName, CopyObjectName, partETagList, uploadId); auto outcome = client.CompleteMultipartUpload(request); if (!outcome.isSuccess()) { /* Handle exceptions. */ std::cout << "CompleteMultipartUpload fail" << ",code:" << outcome.error().Code() << ",message:" << outcome.error().Message() << ",requestId:" << outcome.error().RequestId() << std::endl; return -1; } /* Release resources, such as network resources. */ ShutdownSdk(); return 0; }
Add tags to a symbolic link
The following code provides an example on how to add tags to a symbolic link:
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Initialize information about the account that is used to access OSS. */
/* The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. Using these credentials to perform operations in OSS is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M. To create a RAM user, log on to the RAM console. */
std::string AccessKeyId = "yourAccessKeyId";
std::string AccessKeySecret = "yourAccessKeySecret";
/* Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Specify the name of the bucket. Example: examplebucket. */
std::string BucketName = "examplebucket";
/* Specify the full path of the object. Do not include the bucket name in the full path. Example: exampledir/exampleobject.txt. */
std::string ObjectName = "exampledir/exampleobject.txt";
/* Specify the name of the symbolic link. Example: symlink.txt.
std::string LinkName = "symlink.txt";
/* Initialize resources, such as network resources. */
InitializeSdk();
ClientConfiguration conf;
OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);
std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>();
*content << "test cpp sdk";
PutObjectRequest request(BucketName, ObjectName, content);
/* Upload the object. /
auto outcome = client.PutObject(request);
/* Create the symbolic link. */
CreateSymlinkRequest csRequest(BucketName, ObjectName);
csRequest.SetSymlinkTarget(LinkName);
/* Specify the tags. */
Tagging tagging;
tagging.addTag(Tag("key1", "value1"));
tagging.addTag(Tag("key2", "value2"));
csRequest.setTagging(tagging.toQueryParameters());
auto csoutcome = client.CreateSymlink(csRequest);
if (!csoutcome.isSuccess()) {
/* Handle exceptions. */
std::cout << "CreateSymlink fail" <<
",code:" << csoutcome.error().Code() <<
",message:" << csoutcome.error().Message() <<
",requestId:" << csoutcome.error().RequestId() << std::endl;
return -1;
}
/* Release resources, such as network resources. */
ShutdownSdk();
return 0;
}
References
- For the complete sample code that is used to configure object tagging, visit GitHub.
- For more information about the API operation that you can call to configure object tagging, see PutObjectTagging.