Object Storage Service (OSS) allows you to configure object tags to classify objects. You can configure lifecycle rules and control access to objects based on tags.

Background information

When you configure object tagging, take note of the following items:

  • You can add tags to an object when and after you upload the object. If the object already has tags, the existing tags are overwritten. For more information about object tags, see PutObjectTagging.
  • To add tags to an object, you must have permissions to call the PutObjectTagging operation.

    You can configure a custom policy in the Script configuration mode to grant the permissions to a specific RAM user. For more information, see Assign a custom RAM policy for a RAM user.

  • The Last-Modified value of an object is not updated when its tags are changed.
  • You can add up to 10 tags to an object. The tags added to an object must have unique keys.
  • A tag key can be a maximum of 128 characters in length. A tag value can be a maximum of 256 characters in length.
  • Tag keys and tag values are case-sensitive.
  • The key and value of a tag can contain letters, digits, spaces, and the following special characters:

    + - = ._:/

    Note If you configure the tags in the HTTP header and the tags contain characters, you can encode the keys and values of the tags by using URL encoding.

Object tagging uses a key-value pair to identify objects. For more information about object tags, see Configure object tagging.

Add tags to an object when you upload the object

The following examples describe how to add tags to objects in simple upload, multipart upload, append upload, and resumable upload:

  • 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:

    // Set yourEndpoint to the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set yourEndpoint to https://oss-cn-hangzhou.aliyuncs.com. 
    String endpoint = "yourEndpoint";
    // Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account to access OSS because the account has permissions on all API operations. 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. 
    String accessKeyId = "yourAccessKeyId";
    String accessKeySecret = "yourAccessKeySecret";
    // Specify the name of the bucket. Example: examplebucket. 
    String bucketName = "examplebucket";
    // Specify the full path of the object. Example: exampledir/exampleobject.txt. The full path of the object cannot contain the bucket name. 
    String objectName = "exampledir/exampleobject.txt";
    
    // Create an OSSClient instance. 
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    Map<String, String> tags = new HashMap<String, String>();
    // Specify the key and value of the object tag. For example, set the key to owner and the value to John. 
    tags.put("owner", "John");
    tags.put("type", "document");
    
    // Configure the tags in the HTTP header. 
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setObjectTagging(tags);
    
    // Upload the object and add tags to it. 
    String content = "<yourtContent>";
    ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()), metadata);
    
    // Shut down the OSSClient instance. 
    ossClient.shutdown();
  • Add tags to an object when you upload it by using multipart upload

    The following code provides an example on how to add tags to an object when you upload it by using multipart upload:

    // Set yourEndpoint to the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set yourEndpoint to https://oss-cn-hangzhou.aliyuncs.com. 
    String endpoint = "yourEndpoint";
    // Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account to access OSS because the account has permissions on all API operations. 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. 
    String accessKeyId = "yourAccessKeyId";
    String accessKeySecret = "yourAccessKeySecret";
    // Specify the name of the bucket. Example: examplebucket. 
    String bucketName = "examplebucket";
    // Specify the full path of the object. Example: exampledir/exampleobject.txt. The full path of the object cannot contain the bucket name. 
    String objectName = "exampledir/exampleobject.txt";
    // Specify the full path of the local file to upload. By default, if you do not specify the local file, the local file is uploaded from the path of the project to which the sample program belongs. 
    String localFile = "D:\\localpath\\examplefile.txt";
    
    // Create an OSSClient instance. 
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    /* 
       Step 1: Initialize a multipart upload task. 
    */
    // Configure the tags in the HTTP header. 
    Map<String, String> tags = new HashMap<String, String>();
    // Specify the key and value of the object tag. For example, set the key to owner and the value to John. 
    tags.put("owner", "John");
    tags.put("type", "document");
    
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setObjectTagging(tags);
    
    // Send an InitiateMultipartUploadRequest request and add tags to the object. 
    InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName, metadata);
    InitiateMultipartUploadResult result = ossClient.initiateMultipartUpload(request);
    // Obtain the upload ID, which uniquely identifies the multipart upload task. You can use it to cancel or query the multipart upload task. 
    String uploadId = result.getUploadId();
    
    /* 
       Step 2: Upload parts. 
    */
    // partETags is a set of PartETags. A PartETag consists of an ETag and a part number. 
    List<PartETag> partETags =  new ArrayList<PartETag>();
    // Calculate the total number of parts to upload. 
    final long partSize = 1 * 1024 * 1024L;   // Set the part size to 1 MB. 
    final File sampleFile = new File(localFile);
    long fileLength = sampleFile.length();
    int partCount = (int) (fileLength / partSize);
    if (fileLength % partSize != 0) {
        partCount++;
     }
    // Upload each part until all parts are uploaded. 
    for (int i = 0; i < partCount; i++) {
        long startPos = i * partSize;
        long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
        InputStream instream = null;
        try {
            instream = new FileInputStream(sampleFile);
            // Skip the parts that have been uploaded. 
            instream.skip(startPos);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        UploadPartRequest uploadPartRequest = new UploadPartRequest();
        uploadPartRequest.setBucketName(bucketName);
        uploadPartRequest.setKey(objectName);
        uploadPartRequest.setUploadId(uploadId);
        uploadPartRequest.setInputStream(instream);
        // Set the size available for each part. Each part except the last part must be larger than 100 KB in size. 
        uploadPartRequest.setPartSize(curPartSize);
        // Configure part numbers. Each part is configured with a part number. The number ranges from 1 to 10000. If you configure a part number beyond the range, OSS returns an InvalidArgument error code. 
        uploadPartRequest.setPartNumber( i + 1);
        // Parts are not necessarily uploaded in order. They can be uploaded from different OSS clients. OSS sorts the parts based on their part numbers and combines them to obtain a complete object. 
        UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
        // After you upload a part, OSS returns a result that contains a PartETag. The PartETag is stored in partETags. 
        partETags.add(uploadPartResult.getPartETag());
    }
    
    /* Step 3: Complete multipart upload. 
    */
    // partETags must be sequenced by part numbers in ascending order. 
    Collections.sort(partETags, new Comparator<PartETag>() {
        public int compare(PartETag p1, PartETag p2) {
            return p1.getPartNumber() - p2.getPartNumber();
        }
    });
    // You must provide all valid PartETags when you perform this operation. After OSS receives the partETags, OSS verifies the validity of all parts one by one. After all parts are verified, OSS combines these parts into a complete object. 
    CompleteMultipartUploadRequest completeMultipartUploadRequest =
            new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);
    ossClient.completeMultipartUpload(completeMultipartUploadRequest);
    
    // View the tags added to the object. 
    TagSet tagSet = ossClient.getObjectTagging(bucketName, objectName);
    Map<String, String> getTags = tagSet.getAllTags();
    System.out.println("object tagging: "+ getTags.toString());
    
    // Shut down the OSSClient instance. 
    ossClient.shutdown();
  • Add tags to an object when you upload it by using append upload

    The following code provides an example on how to add tags to an object when you upload it by using append upload:

    // Set yourEndpoint to the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set yourEndpoint to https://oss-cn-hangzhou.aliyuncs.com. 
    String endpoint = "yourEndpoint";
    // Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account to access OSS because the account has permissions on all API operations. 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. 
    String accessKeyId = "yourAccessKeyId";
    String accessKeySecret = "yourAccessKeySecret";
    // Specify the name of the bucket. Example: examplebucket. 
    String bucketName = "examplebucket";
    // Specify the full path of the object. Example: exampledir/exampleobject.txt. The full path of the object cannot contain the bucket name. 
    String objectName = "exampledir/exampleobject.txt";
    
    // Create an OSSClient instance. 
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    String content1 = "Hello OSS A \n";
    String content2 = "Hello OSS B \n";
    String content3 = "Hello OSS C \n";
    
    Map<String, String> tags = new HashMap<String, String>();
    // Specify the key and value of the object tag. For example, set the key to owner and the value to John. 
    tags.put("owner", "John");
    tags.put("type", "document");
    
    ObjectMetadata meta = new ObjectMetadata();
    // Configure the tags for the uploaded object. 
     meta.setObjectTagging(tags);
    // Specify the type of content you want to upload. 
    meta.setContentType("text/plain");
    
    // Configure multiple parameters by using AppendObjectRequest. 
    AppendObjectRequest appendObjectRequest = new AppendObjectRequest(bucketName, objectName, new ByteArrayInputStream(content1.getBytes()), meta);
    
    // Configure a single parameter by using AppendObjectRequest. 
    //appendObjectRequest.setBucketName(bucketName);
    //appendObjectRequest.setKey(objectName);
    // Specify the content you want to append. Two types of content are available: InputStream and File. The following code provides an example on how to specify the content of the InputStream type. 
    //appendObjectRequest.setInputStream(new ByteArrayInputStream(content1.getBytes()));
    // Specify the content you want to append. Two types of content are available: InputStream and File. The following code provides an example on how to specify the content of the File type. 
    // Specify the full path of the local file to upload. By default, if you do not specify the local file, the local file is uploaded from the path of the project to which the sample program belongs. 
    //appendObjectRequest.setFile(new File("D:\\localpath\\examplefile.txt"));
    // Specify the object metadata. You can specify the metadata of an object only when you perform the append operation on the object for the first time. 
    //appendObjectRequest.setMetadata(meta);
    
    // Perform the first append operation. Only the tags configured when the object is appended for the first time are added to the object. 
    // Configure the position from which the append operation starts. 
    appendObjectRequest.setPosition(0L);
    AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
    // Calculate the CRC-64 of the object. The value is calculated based on the ECMA-182 standard. 
    System.out.println(appendObjectResult.getObjectCRC());
    
    // Start the second append. 
    // NextPosition indicates the position from which the next append operation starts, which is the current length of the object. 
    appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
    appendObjectRequest.setInputStream(new ByteArrayInputStream(content2.getBytes()));
    appendObjectResult = ossClient.appendObject(appendObjectRequest);
    
    // Perform the third append operation. 
    appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
    appendObjectRequest.setInputStream(new ByteArrayInputStream(content3.getBytes()));
    appendObjectResult = ossClient.appendObject(appendObjectRequest);
    
    // View the tags added to the uploaded object. 
    TagSet tagSet = ossClient.getObjectTagging(bucketName, objectName);
    Map<String, String> getTags = tagSet.getAllTags();
    System.out.println("object tagging: "+ getTags.toString());
    
    // Shut down the OSSClient instance. 
    ossClient.shutdown();
  • Add tags to an object when you upload it by using resumable upload

    The following code provides an example on how to add tags to an object when you upload it by using resumable upload:

    // Set yourEndpoint to the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set yourEndpoint to https://oss-cn-hangzhou.aliyuncs.com. 
    String endpoint = "yourEndpoint";
    // Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account to access OSS because the account has permissions on all API operations. 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. 
    String accessKeyId = "yourAccessKeyId";
    String accessKeySecret = "yourAccessKeySecret";
    // Specify the name of the bucket. Example: examplebucket. 
    String bucketName = "examplebucket";
    // Specify the full path of the object. Example: exampledir/exampleobject.txt. The full path of the object cannot contain the bucket name. 
    String objectName = "exampledir/exampleobject.txt";
    // Specify the full path of the local file to upload. By default, if you do not specify the local file, the local file is uploaded from the path of the project to which the sample program belongs. 
    String localFile = "D:\\localpath\\examplefile.txt";
    
    // Create an OSSClient instance. 
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    // Configure the tags to be added to the object. 
    Map<String, String> tags = new HashMap<String, String>();
    // Specify the key and value of the object tag. For example, set the key to owner and the value to John. 
    tags.put("owner", "John");
    tags.put("type", "document");
    
    ObjectMetadata meta = new ObjectMetadata();
    // Specify the type of content you want to upload. 
    meta.setContentType("text/plain");
    // Add the tags to the object. 
    meta.setObjectTagging(tags);
    
    // Configure parameters by using UploadFileRequest. 
    UploadFileRequest uploadFileRequest = new UploadFileRequest(bucketName,objectName);
    
    // Configure a single parameter by using UploadFileRequest. 
    // Specify the bucket name. 
    //uploadFileRequest.setBucketName(bucketName);
    // Specify the full path of the object. 
    //uploadFileRequest.setKey(objectName);
    // Specify the local file to upload. 
    uploadFileRequest.setUploadFile(localFile);
    // Specify the number of threads for the resumable upload task. Default value: 1. 
    uploadFileRequest.setTaskNum(5);
    // Specify the size of each part to upload. Valid values: 100 KB to 5 GB. The default size of each part is calculated based on the following formula: Default size of each part = Object size/10000. 
    uploadFileRequest.setPartSize(1 * 1024 * 1024);
    // Enable resumable upload, which is disabled by default. 
    uploadFileRequest.setEnableCheckpoint(true);
    // Specify the checkpoint file that records the upload result of each part. You must set this parameter if you want to perform resumable upload by using multipart upload. The checkpoint file stores the progress information about a multipart upload task. If a part fails to be uploaded, the task can be continued based on the progress recorded in the checkpoint file. After the object is uploaded, the file is deleted. By default, this file is stored in uploadFile.ucp, which is the same directory as that of the local file you want to upload. 
    uploadFileRequest.setCheckpointFile("yourCheckpointFile");
    // Configure object metadata. 
    uploadFileRequest.setObjectMetadata(meta);
    // Configure upload callback. The parameter type is Callback. 
    //uploadFileRequest.setCallback("yourCallbackEvent");
    
    // Start the resumable upload task and configure the tags to be added to the object. 
    ossClient.uploadFile(uploadFileRequest);
    
    // View the tags added to the object. 
    TagSet tagSet = ossClient.getObjectTagging(bucketName, objectName);
    Map<String, String> getTags = tagSet.getAllTags();
    System.out.println("object tagging: "+ getTags.toString());
    
    // Shut down the OSSClient instance. 
    ossClient.shutdown();

Add tags to or modify the tags of an existing object

If an existing object has no tags or the added tags of the object do not meet your requirements, you can add tags to or modify the tags of the existing object.

The following code provides an example on how to add tags to or modify the tags of an existing object:

// Set yourEndpoint to the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set yourEndpoint to https://oss-cn-hangzhou.aliyuncs.com. 
String endpoint = "yourEndpoint";
// Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account to access OSS because the account has permissions on all API operations. 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. 
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// Specify the name of the bucket. Example: examplebucket. 
String bucketName = "examplebucket";
// Specify the full path of the object. Example: exampledir/exampleobject.txt. The full path of the object cannot contain the bucket name. 
String objectName = "exampledir/exampleobject.txt";

// Create an OSSClient instance. 
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

Map<String, String> tags = new HashMap<String, String>();
// Specify the key and value of the object tag. For example, set the key to owner and the value to John. 
tags.put("owner", "John");
tags.put("type", "document");

// Add tags to the object. 
ossClient.setObjectTagging(bucketName, objectName, tags);

// Shut down the OSSClient instance. 
ossClient.shutdown();

Add tags to or modify the tags of a specified version of an object

If versioning is enabled for the bucket, you can add tags to or modify the tags of a specific version of the object by specifying the version ID of the object.

The following code provides an example on how to add tags to or modify the tags of a specified version of the object:

Note For more information about how to obtain the version IDs of an object, see List objects.
// Set yourEndpoint to the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set yourEndpoint to https://oss-cn-hangzhou.aliyuncs.com. 
String endpoint = "yourEndpoint";
// Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account to access OSS because the account has permissions on all API operations. 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. 
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// Specify the name of the bucket. Example: examplebucket. 
String bucketName = "examplebucket";
// Specify the full path of the object. Example: exampledir/exampleobject.txt. The full path of the object cannot contain the bucket name. 
String objectName = "exampledir/exampleobject.txt";
// Specify the version ID of the object. Example: CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****. 
String versionId = "CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****";

// Create an OSSClient instance. 
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

Map<String, String> tags = new HashMap<String, String>(1);
// Specify the key and value of the object tag. For example, set the key to owner and the value to John. 
tags.put("owner", "John");
tags.put("type", "document");

SetObjectTaggingRequest setObjectTaggingRequest = new SetObjectTaggingRequest(bucketName, objectName, tags);
setObjectTaggingRequest.setVersionId(versionId);
ossClient.setObjectTagging(setObjectTaggingRequest);

// Shut down the OSSClient instance. 
ossClient.shutdown();
            

Add tags to an object when you copy the object

You can configure one of the following tagging parameters when you copy an object. Default value: Copy. 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 objects smaller than 1 GB in simple copy mode and larger than 1 GB in multipart copy mode:

  • Add tags to an object when you copy the object by calling CopyObject

    The following code provides an example on how to add tags to an object smaller than 1 GB when you copy it by calling CopyObject:

    // Set yourEndpoint to the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set yourEndpoint to https://oss-cn-hangzhou.aliyuncs.com. 
    String endpoint = "yourEndpoint";
    // Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account to access OSS because the account has permissions on all API operations. 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. 
    String accessKeyId = "yourAccessKeyId";
    String accessKeySecret = "yourAccessKeySecret";
    // Specify the name of the source bucket. Example: srcexamplebucket. 
    String sourceBucketName = "srcexamplebucket";
    // Specify the full path of the source object. Example: srcexampledir/exampleobject.txt. 
    String sourceObjectName = "srcexampledir/exampleobject.txt";
    // Specify the name of the destination bucket. Example: destexamplebucket. 
    String destinationBucketName = "destexamplebucket";
    // Specify the full path of the destination object. Example: destexampledir/exampleobject.txt.  
    String destinationObjectName = "destexampledir/exampleobject.txt";
    
    // Create an OSSClient instance. 
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    // Create a CopyObjectRequest object. 
    CopyObjectRequest copyObjectRequest = new CopyObjectRequest(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);
    
    // Configure the tags to be added to the destination object. If the headers are not configured, the tags of the source object are added to the destination object by default. 
    Map<String, String> headers = new HashMap<String, String>();
    headers.put(OSSHeaders.COPY_OBJECT_TAGGING_DIRECTIVE, "REPLACE");
    headers.put(OSSHeaders.OSS_TAGGING, "key1=value1&key2=value2");
    copyObjectRequest.setHeaders(headers);
    
    // Copy the object. 
    CopyObjectResult result = ossClient.copyObject(copyObjectRequest);
    System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());
    
    // View the tags added to the destination object. 
    TagSet tagSet = ossClient.getObjectTagging(bucketName, destinationObjectName);
    Map<String, String> getTags = tagSet.getAllTags();
    System.out.println("dest object tagging: "+ getTags.toString());
    
    // Shut down the OSSClient instance. 
    ossClient.shutdown();
  • Add tags to an object when you copy the object by calling MultipartUpload

    The following code provides an example on how to add tags to an object larger than 1 GB when you copy it by calling MultipartUpload:

    // Set yourEndpoint to the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set yourEndpoint to https://oss-cn-hangzhou.aliyuncs.com. 
    String endpoint = "yourEndpoint";
    // Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account to access OSS because the account has permissions on all API operations. 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. 
    String accessKeyId = "yourAccessKeyId";
    String accessKeySecret = "yourAccessKeySecret";
    // Specify the name of the source bucket. Example: srcexamplebucket. 
    String sourceBucketName = "srcexamplebucket";
    // Specify the full path of the source object. Example: srcexampledir/exampleobject.txt. 
    String sourceObjectName = "srcexampledir/exampleobject.txt";
    // Specify the name of the destination bucket. Example: destexamplebucket. 
    String destinationBucketName = "destexamplebucket";
    // Specify the full path of the destination object. Example: destexampledir/exampleobject.txt.  
    String destinationObjectName = "destexampledir/exampleobject.txt";
    
    ObjectMetadata objectMetadata = ossClient.getObjectMetadata(sourceBucketName, sourceObjectName);
    // Query the size of the object to copy. 
    long contentLength = objectMetadata.getContentLength();
    // Set the size of each part to 10 MB. 
    long partSize = 1024 * 1024 * 10;
    // Calculate the total number of parts. 
    int partCount = (int) (contentLength / partSize);
    if (contentLength % partSize != 0) {
        partCount++;
    }
    
    System.out.println("total part count:" + partCount);
    
    // Configure the tags in the HTTP header. 
    Map<String, String> tags2 = new HashMap<String, String>();
    // Specify the key and value of the object tag. For example, set the key to owner and the value to Lily. 
    tags2.put("owner", "Lily");
    tags2.put("type", "document");
    
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setObjectTagging(tags2);
    
    // Initiate a multipart copy task and configure the tags to be added to the destination object. 
    InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(destinationBucketName, destinationObjectName, metadata);
    InitiateMultipartUploadResult initiateMultipartUploadResult = ossClient.initiateMultipartUpload(initiateMultipartUploadRequest);
    String uploadId = initiateMultipartUploadResult.getUploadId();
    
    // Start the multipart copy task. 
    List<PartETag> partETags = new ArrayList<PartETag>();
    for (int i = 0; i < partCount; i++) {
         // Calculate the size of each part. 
        long skipBytes = partSize * i;
        long size = partSize < contentLength - skipBytes ? partSize : contentLength - skipBytes;
    
        // Create an UploadPartCopyRequest object. You can call the UploadPartCopyRequest operation to specify conditions. 
        UploadPartCopyRequest uploadPartCopyRequest = 
            new UploadPartCopyRequest(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);
        uploadPartCopyRequest.setUploadId(uploadId);
        uploadPartCopyRequest.setPartSize(size);
        uploadPartCopyRequest.setBeginIndex(skipBytes);
        uploadPartCopyRequest.setPartNumber(i + 1);
    
        UploadPartCopyResult uploadPartCopyResult = ossClient.uploadPartCopy(uploadPartCopyRequest);
        // Store the returned part ETags in partETags. 
        partETags.add(uploadPartCopyResult.getPartETag());
    }
    
    // Complete the multipart copy task. 
    CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(
                        destinationBucketName, destinationObjectName, uploadId, partETags);
    CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
    
    // View the tags of the source object. 
    TagSet tagSet = ossClient.getObjectTagging(bucketName, sourceObjectName);
    Map<String, String> getTags = tagSet.getAllTags();
    System.out.println("src object tagging: "+ getTags.toString());
    
    // View the tags of the destination object. 
    tagSet = ossClient.getObjectTagging(bucketName, destinationObjectName);
    getTags = tagSet.getAllTags();
    System.out.println("dest object tagging: "+ getTags.toString());
    
    // Shut down the OSSClient instance. 
    ossClient.shutdown();

Add tags to a symbolic link

The following code provides an example on how to add tags to a symbolic link:

// Set yourEndpoint to the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set yourEndpoint to https://oss-cn-hangzhou.aliyuncs.com. 
String endpoint = "yourEndpoint";
// Security risks may arise if you use the AccessKey pair of an Alibaba Cloud account to access OSS because the account has permissions on all API operations. 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. 
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// Specify the name of the bucket. Example: examplebucket. 
String bucketName = "examplebucket";
// Specify the full path of the symbolic link. Example: shortcut/myobject.txt. 
String symLink = "shortcut/myobject.txt";
// Specify the full path of the object. Example: exampledir/exampleobject.txt. The full path of the object cannot contain the bucket name. 
String destinationObjectName = "exampledir/exampleobject.txt";

// Create an OSSClient instance. 
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// Configure the tags to be added to the symbolic link. 
Map<String, String> tags = new HashMap<String, String>();
// Specify the key and value of the object tag. For example, set the key to owner and the value to John. 
tags.put("owner", "John");
tags.put("type", "document");

// Create metadata for the object to upload. 
ObjectMetadata metadata = new ObjectMetadata();
metadata.setObjectTagging(tags);

// Create a request to create the symbolic link. 
CreateSymlinkRequest createSymlinkRequest = new CreateSymlinkRequest(bucketName, symLink, destinationObjectName);

// Set the object metadata. 
createSymlinkRequest.setMetadata(metadata);

// Create the symbolic link. 
ossClient.createSymlink(createSymlinkRequest);

// View the tags added to the symbolic link. 
TagSet tagSet = ossClient.getObjectTagging(bucketName, symLink);
Map<String, String> getTags = tagSet.getAllTags();
System.out.println("symLink tagging: "+ getTags.toString());

// Shut down the OSSClient instance. 
ossClient.shutdown();