设置Object标签

OSS ON云盒支持使用标签对云盒Bucket中的文件(Object)进行分类,您可以针对同标签的Object设置生命周期规则、访问权限等。

标签规则

Object标签使用一组键值对(Key-Value)标记Object,您可以在上传Object时添加标签,也可以为已有Object添加标签。
  • 单个Object最多可设置10个标签,Key不可重复。
  • 每个Key长度不超过128字符,每个Value长度不超过256字符。
  • Key和Value区分大小写。
  • 标签合法字符集包括大小写字母、数字、空格和以下符号:

    +‑=._:/

    通过HTTP Header的方式设置标签且标签中包含任意字符时,您需要对标签的Key和Value进行URL编码。

注意事项

  • 只有Bucket拥有者以及被授予oss-cloudbox:PutObjectTagging权限的用户拥有读写Object标签的权限。

  • 您可以在简单上传、分片上传、追加上传以及拷贝文件过程中为Object设置标签,也可以对已上传Object设置标签。
  • 更改标签信息不会更新Object的Last‑Modified时间。

使用场景

  • Object标签结合生命周期
    对于周期性生成且无需长期保存的Object,可以在上传时设置指定的标签,之后通过生命周期规则,将拥有该标签的文件定期删除,从而节省存储费用。例如,通过生命周期规则指定前缀为dir1且拥有Key为key1、Value为value1标签的Object在距离最后一次更新时间30天后删除,配置示例如下:
    <LifecycleConfiguration>
     <Rule>
      <ID>rule1</ID>
      <Prefix>dir1</Prefix>
      <Tag><Key>key1</Key><Value>value1</Value></Tag>
      <Status>Enabled</Status>
      <Expiration>
        <Days>30</Days>
      </Expiration>
     </Rule>
    </LifecycleConfiguration>
  • 授权RAM用户访问指定标签的Object

    您可以通过RAM Policy授予RAM用户访问名为examplebucket的云盒Bucket下标签为status:ok以及key1:value1的Object的权限,该Bucket所属的云盒ID为cb-f8z7yvzgwfkl9q0h****

    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "oss-cloudbox:GetObject"
                ],
                "Resource": [
                    "acs:oss-cloudbox:*:174649585760****:cloudbox/cb-f8z7yvzgwfkl9q0h****/bucket/examplebucket/*"
                ],
                "Condition": {
                    "StringEquals": {
                        "oss-cloudbox:ExistingObjectTag/status":"ok",
                        "oss-cloudbox:ExistingObjectTag/key1":"value1"
                    }
                }
            }
        ]
    }

操作步骤

使用阿里云SDK

仅支持通过Java SDK在简单上传的同时设置标签信息,Java SDK要求3.15.0及以上版本。

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import java.io.ByteArrayInputStream;
import java.util.HashMap;
import java.util.Map;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;

public class Demo {
    public static void main(String[] args) throws Exception {
        // 填写云盒Bucket的数据域名。
        String endpoint = "https://cb-f8z7yvzgwfkl9q0h****.cn-hangzhou.oss-cloudbox.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写云盒Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 填写云盒Bucket所在地域。
        String region = "cn-hangzhou";
        // 填写云盒ID。
        String cloudBoxId = "cb-f8z7yvzgwfkl9q0h****";
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String objectName = "exampledir/exampleobject.txt";

        // 创建OSSClient实例。
        ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
        conf.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(new DefaultCredentialProvider(credentialsProvider.getCredentials()))
                .clientConfiguration(conf)
                .region(region)
                .cloudBoxId(cloudBoxId)
                .build();

        try {
            Map<String, String> tags = new HashMap<String, String>();
            // 依次填写标签的键(例如owner)和值(例如John)。
            tags.put("owner", "John");
            tags.put("type", "document");

            // 在HTTP header中设置标签信息。
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setObjectTagging(tags);

            // 设置上传的Object内容。
            String content = "yourContent";
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()), metadata);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

使用命令行工具ossutil

关于使用ossutil设置Object标签的具体操作,请参见添加或修改Object标签

使用REST API

如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见PutObjectTagging