OSS支持使用对象标签(Object Tagging)对存储空间(Bucket)中的文件(Object)进行分类,您可以针对相同标签的Object设置生命周期规则、访问权限等。
背景信息
设置对象标签时,请注意以下事项:
您可以在上传Object时设置对象标签,也可以对已上传Object设置对象标签。设置对象标签时,如果对象已有标签,则覆盖原标签。关于设置对象标签的更多信息,请参见PutObjectTagging。
设置对象标签时,您要有PutObjectTagging权限。
请通过脚本配置方式创建以上自定义权限策略,然后为指定的RAM用户授予相应权限。具体操作,请参见为RAM用户授权自定义的权限策略。
更改标签时不会更新Object的Last‑Modified时间。
单个Object最多可设置10个标签,Key不可重复。
每个Key长度不超过128字符,每个Value长度不超过256字符。
Key和Value区分大小写。
标签合法字符集包括大小写字母、数字、空格和以下符号:
+‑=._:/
说明通过HTTP header的方式设置标签且标签中包含任意字符时,您可以对标签的Key和Value做URL编码。
对象标签使用一组键值对(Key-Value)来标记对象。关于对象标签的更多信息,请参见对象标签。
注意事项
本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心。
本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见初始化。
要设置对象标签,您必须具有
oss:PutObjectTagging
权限。具体操作,请参见为RAM用户授权自定义的权限策略。
上传Object时添加对象标签
简单上传时添加对象标签
以下代码用于简单上传Object时添加对象标签。
# -*- coding: utf-8 -*- import oss2 from oss2.headers import OSS_OBJECT_TAGGING from oss2.credentials import EnvironmentVariableCredentialsProvider # 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。 # 填写Bucket名称。 bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket') # 填写Object完整路径,Object完整路径中不能包含Bucket名称。例如exampledir/exampleobject.txt。 object_name = 'exampledir/exampleobject.txt' # 设置tagging字符串。 tagging = "k1=v1&k2=v2&k3=v3" # 如果标签中包含了任意字符,则需要对标签的Key和Value做URL编码。 k4 = "k4+-=" v4 = "+-=._:/" tagging += "&" + oss2.urlquote(k4) + "=" + oss2.urlquote(v4) # 在HTTP header中设置标签信息。 headers = dict() headers[OSS_OBJECT_TAGGING] = tagging # 调用put_object接口时指定headers,将会为上传的文件添加标签。 result = bucket.put_object(object_name, 'content', headers=headers) print('http response status: ', result.status) # 查看Object的标签信息。 result = bucket.get_object_tagging(object_name) for key in result.tag_set.tagging_rule: print('tagging key: {}, value: {}'.format(key, result.tag_set.tagging_rule[key]))
分片上传时添加对象标签
以下代码用于通过multipart_upload方式上传Object时添加对象标签。
# -*- coding: utf-8 -*- import os import oss2 from oss2 import SizedFileAdapter, determine_part_size from oss2.models import PartInfo from oss2.headers import OSS_OBJECT_TAGGING from oss2.credentials import EnvironmentVariableCredentialsProvider # 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。 # 填写Bucket名称。 bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket') # 填写Object完整路径,Object完整路径中不能包含Bucket名称。例如exampledir/exampleobject.txt。 object_name = 'exampledir/exampleobject.txt' # 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。 # 如果未指定本地路径只填写了文件名称(例如examplefile.txt),则默认从示例程序所属项目对应本地路径中上传文件。 filename = 'D:\\localpath\\examplefile.txt' total_size = os.path.getsize(filename) # determine_part_size方法用于确定分片大小。 part_size = determine_part_size(total_size, preferred_size=100 * 1024) # 设置tagging字符串。 tagging = "k1=v1&k2=v2&k3=v3" # 如果标签中包含了任意字符,则需要对标签的Key和Value做URL编码。 k4 = "k4+-=" v4 = "+-=._:/" tagging += "&" + oss2.urlquote(k4) + "=" + oss2.urlquote(v4) # 在HTTP header中设置标签信息。 headers = dict() headers[OSS_OBJECT_TAGGING] = tagging # 初始化分片。 # 调用init_multipart_upload接口时指定headers,将会给上传的文件添加标签。 upload_id = bucket.init_multipart_upload(object_name, headers=headers).upload_id parts = [] # 逐个上传分片。 with open(filename, 'rb') as fileobj: part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) # SizedFileAdapter(fileobj, size)方法会生成一个新的文件对象,重新计算起始追加位置。 result = bucket.upload_part(object_name, upload_id, part_number, SizedFileAdapter(fileobj, num_to_upload)) parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1 # 完成分片上传。 result = bucket.complete_multipart_upload(object_name, upload_id, parts) print('http response status: ', result.status) # 查看Object的标签信息。 result = bucket.get_object_tagging(object_name) for key in result.tag_set.tagging_rule: print('tagging key: {}, value: {}'.format(key, result.tag_set.tagging_rule[key])) # 验证分片上传。 with open(filename, 'rb') as fileobj: assert bucket.get_object(object_name).read() == fileobj.read()
追加上传时添加对象标签
以下代码用于通过append_object方式上传Object时添加对象标签。
# -*- coding: utf-8 -*- import oss2 from oss2.headers import OSS_OBJECT_TAGGING from oss2.credentials import EnvironmentVariableCredentialsProvider # 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。 # 填写Bucket名称。 bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket') # 填写Object完整路径,Object完整路径中不能包含Bucket名称。例如exampledir/exampleobject.txt。 object_name = 'exampledir/exampleobject.txt' # 设置tagging字符串。 tagging = "k1=v1&k2=v2&k3=v3" # 如果标签中包含了任意字符,则需要对标签的Key和Value做URL编码。 k4 = "k4+-=" v4 = "+-=._:/" tagging += "&" + oss2.urlquote(k4) + "=" + oss2.urlquote(v4) # 在HTTP header中设置标签信息。 headers = dict() headers[OSS_OBJECT_TAGGING] = tagging # 追加上传文件。调用append_object接口时指定headers,将会给文件设置标签。 # 只有第一次调用append_object设置的标签才会生效,后续使用此种方式添加的标签不生效。 result = bucket.append_object(object_name, 0, '<yourContent>', headers=headers) # 查看Object的标签信息。 result = bucket.get_object_tagging(object_name) for key in result.tag_set.tagging_rule: print('tagging key: {}, value: {}'.format(key, result.tag_set.tagging_rule[key]))
断点续传上传时添加对象标签
以下代码用于通过resumable_upload方式上传Object时添加对象标签。
# -*- coding: utf-8 -*- import oss2 from oss2.headers import OSS_OBJECT_TAGGING from oss2.credentials import EnvironmentVariableCredentialsProvider # 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。 # 填写Bucket名称。 bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket') # 填写Object完整路径,Object完整路径中不能包含Bucket名称。例如exampledir/exampleobject.txt。 object_name = 'exampledir/exampleobject.txt' # 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。 local_file = 'D:\\localpath\\examplefile.txt' # 设置tagging字符串。 tagging = "k1=v1&k2=v2&k3=v3" # 如果标签中包含了任意字符,则需要对标签的Key和Value做URL编码。 k4 = "k4+-=" v4 = "+-=._:/" tagging += "&" + oss2.urlquote(k4) + "=" + oss2.urlquote(v4) # 在HTTP header中设置标签信息。 headers = dict() headers[OSS_OBJECT_TAGGING] = tagging # 当文件长度大于或等于可选参数multipart_threshold(默认值为10 MB)时使用分片上传。如果未使用参数store指定目录,则会在HOME目录下建立.py-oss-upload目录来保存断点信息。 # 调用resumable_upload接口时指定headers,将会给上传的文件添加标签。 oss2.resumable_upload(bucket, object_name, local_file, headers=headers) result = bucket.get_object_tagging(object_name) for key in result.tag_set.tagging_rule: print('object tagging key: {}, value: {}'.format(key, result.tag_set.tagging_rule[key]))
为已上传Object添加或更改对象标签
如果上传Object时未添加对象标签或者添加的对象标签不满足使用需求,您可以在上传Object后为Object添加或更改对象标签。
以下代码用于为已上传Object添加或更改对象标签。
# -*- coding: utf-8 -*-
import oss2
from oss2.models import Tagging, TaggingRule
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
#填写Object完整路径,Object完整路径中不能包含Bucket名称。例如exampledir/exampleobject.txt。
object_name = 'exampledir/exampleobject.txt'
# 创建标签规则。
rule = TaggingRule()
rule.add('key1', 'value1')
rule.add('key2', 'value2')
# 创建标签。
tagging = Tagging(rule)
# 设置标签。
result = bucket.put_object_tagging(object_name, tagging)
# 查看HTTP返回码。
print('http response status:', result.status)
为Object指定版本添加或更改对象标签
在已开启版本控制的Bucket中,通过指定Object的版本ID(versionId),您可以为Object指定版本添加或更改对象标签。
以下代码用于为Object指定版本添加或更改对象标签。
关于获取versionId的具体操作,请参见列举文件。
# -*- coding: utf-8 -*-
import oss2
from oss2.models import Tagging
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
#填写Object完整路径,Object完整路径中不能包含Bucket名称。例如exampledir/exampleobject.txt。
object_name = 'exampledir/exampleobject.txt'
# 填写Object的版本ID,例如CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****。
version_id = 'CAEQMxiBgICAof2D0BYiIDJhMGE3N2M1YTI1NDQzOGY5NTkyNTI3MGYyMzJm****'
tagging = Tagging()
# 依次填写对象标签的键(例如owner)和值(例如John)。
tagging.tag_set.add('owner', 'John')
tagging.tag_set.add('type', 'document')
params = dict()
params['versionId'] = version_id
bucket.put_object_tagging(object_name, tagging, params=params)
拷贝Object时设置对象标签
拷贝Object时,可以指定如何设置目标Object的对象标签。取值如下:
Copy(默认值):复制源Object的对象标签到目标Object。
Replace:忽略源Object的对象标签,直接采用请求中指定的对象标签。
以下分别提供了简单拷贝1 GB以下的Object及分片拷贝1 GB以上的Object时设置对象标签的详细示例。
简单拷贝时设置对象标签
以下代码用于简单拷贝1 GB以下的Object时设置对象标签。
# -*- coding: utf-8 -*- import oss2 from oss2.headers import OSS_OBJECT_TAGGING, OSS_OBJECT_TAGGING_COPY_DIRECTIVE from oss2.credentials import EnvironmentVariableCredentialsProvider # 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。 # 填写Bucket名称。 bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket') # 填写源Object完整路径,Object完整路径中不能包含Bucket名称。例如srcexampledir/exampleobject.txt。 src_object_name = 'srcexampledir/exampleobject.txt' # 填写目标Object完整路径,Object完整路径中不能包含Bucket名称。例如destexampledir1/exampleobject.txt。 dest_object_name1 = 'destexampledir1/exampleobject.txt' # 填写目标Object完整路径,Object完整路径中不能包含Bucket名称。例如destexampledir2/exampleobject.txt。 dest_object_name2 = 'destexampledir2/exampleobject.txt' # 设置tagging字符串。 tagging = "k1=v1&k2=v2&k3=v3" # 如果标签中包含了任意字符,则需要对标签的Key和Value做URL编码。 k4 = "k4+-=" v4 = "+-=._:/" tagging += "&" + oss2.urlquote(k4) + "=" + oss2.urlquote(v4) # 在HTTP header中指定OSS_OBJECT_TAGGING_COPY_DIRECTIVE参数为COPY或者默认不指定,则dest_object_name1将拥有与源文件相同的标签信息。 headers=dict() headers[OSS_OBJECT_TAGGING_COPY_DIRECTIVE] = 'COPY' bucket.copy_object(bucket.bucket_name, src_object_name, dest_object_name1, headers=headers) # 在HTTP header中指定OSS_OBJECT_TAGGING_COPY_DIRECTIVE参数为REPLACE,则dest_object_name2的标签信息将会设置为headers[OSS_OBJECT_TAGGING]指定的标签信息。 headers[OSS_OBJECT_TAGGING_COPY_DIRECTIVE] = 'REPLACE' headers[OSS_OBJECT_TAGGING] = tagging bucket.copy_object(bucket.bucket_name, src_object_name, dest_object_name2, headers=headers) # 查看src_object_name的标签信息。 result = bucket.get_object_tagging(src_object_name) for key in result.tag_set.tagging_rule: print('src tagging key: {}, value: {}'.format(key, result.tag_set.tagging_rule[key])) # 查看dest_object_name1的标签信息。dest_object_name1的标签信息与src_object_name的标签信息相同。 result = bucket.get_object_tagging(dest_object_name1) for key in result.tag_set.tagging_rule: print('dest1 object tagging key: {}, value: {}'.format(key, result.tag_set.tagging_rule[key])) # 查看dest_object_name2的标签信息。dest_object_name2的标签信息为headers[OSS_OBJECT_TAGGING]指定的标签信息。 result = bucket.get_object_tagging(dest_object_name2) for key in result.tag_set.tagging_rule: print('dest2 object tagging key: {}, value: {}'.format(key, result.tag_set.tagging_rule[key]))
分片拷贝时设置对象标签
以下代码用于分片拷贝1 GB以上的Object时设置对象标签。
# -*- coding: utf-8 -*- import os import oss2 from oss2 import determine_part_size from oss2.models import PartInfo from oss2.headers import OSS_OBJECT_TAGGING from oss2.credentials import EnvironmentVariableCredentialsProvider # 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。 # 填写Bucket名称。 bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket') # 填写源Object完整路径,Object完整路径中不能包含Bucket名称。例如srcexampledir/exampleobject.txt。 src_object_name = 'srcexampledir/exampleobject.txt' # 填写目标Object完整路径,Object完整路径中不能包含Bucket名称。例如destexampledir/exampleobject.txt。 dest_object_name = 'destexampledir/exampleobject.txt' # 获取源文件的文件大小。 head_info = bucket.head_object(src_object_name) total_size = head_info.content_length print('src object size:', total_size) # determine_part_size方法用于确定分片大小。 part_size = determine_part_size(total_size, preferred_size=100 * 1024) print('part_size:', part_size) # 设置tagging字符串。 tagging = "k1=v1&k2=v2&k3=v3" # 如果标签中包含了任意字符,则需要对标签的Key和Value做URL编码。 k4 = "k4+-=" v4 = "+-=._:/" tagging += "&" + oss2.urlquote(k4) + "=" + oss2.urlquote(v4) # 在HTTP header中设置标签信息。 headers = dict() headers[OSS_OBJECT_TAGGING] = tagging # 初始化分片。 # 调用init_multipart_upload接口时指定headers,将会给目标文件添加标签。 upload_id = bucket.init_multipart_upload(dest_object_name, headers=headers).upload_id parts = [] # 逐个上传分片。 part_number = 1 offset = 0 while offset < total_size: num_to_upload = min(part_size, total_size - offset) end = offset + num_to_upload - 1; result = bucket.upload_part_copy(bucket.bucket_name, src_object_name, (offset, end), dest_object_name, upload_id, part_number) #保存part信息 parts.append(PartInfo(part_number, result.etag)) offset += num_to_upload part_number += 1 # 完成分片上传。 result = bucket.complete_multipart_upload(dest_object_name, upload_id, parts) # 获取文件元数据。 head_info = bucket.head_object(dest_object_name) # 查看目标文件大小。 dest_object_size = head_info.content_length print('dest object size:', dest_object_size) # 对比源文件大小。 assert dest_object_size == total_size # 查看源文件的标签信息。 result = bucket.get_object_tagging(src_object_name) for key in result.tag_set.tagging_rule: print('src tagging key: {}, value: {}'.format(key, result.tag_set.tagging_rule[key])) # 查看目标文件的标签信息。 result = bucket.get_object_tagging(dest_object_name) for key in result.tag_set.tagging_rule: print('dest tagging key: {}, value: {}'.format(key, result.tag_set.tagging_rule[key]))
为软链接文件设置标签
以下代码用于为软链接文件设置标签。
# -*- coding: utf-8 -*-
import oss2
from oss2.headers import OSS_OBJECT_TAGGING
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 填写目标Object完整路径,Object完整路径中不能包含Bucket名称。例如exampledir/exampleobject.txt。
object_name = 'exampledir/exampleobject.txt'
# 填写软链接完整路径,例如shortcut/myobject.txt。
symlink_name = 'shortcut/myobject.txt'
# 设置tagging字符串。
tagging = "k1=v1&k2=v2&k3=v3"
# 如果标签中包含了任意字符,则需要对标签的Key和Value做URL编码。
k4 = "k4+-="
v4 = "+-=._:/"
tagging += "&" + oss2.urlquote(k4) + "=" + oss2.urlquote(v4)
# 在HTTP header中设置标签信息。
headers = dict()
headers[OSS_OBJECT_TAGGING] = tagging
# 添加软链接。
# 调用put_symlink接口时指定headers,将会给软链接文件添加标签。
result = bucket.put_symlink(object_name, symlink_name, headers=headers)
print('http response status: ', result.status)
# 查看软链接文件的标签信息。
result = bucket.get_object_tagging(symlink_name)
for key in result.tag_set.tagging_rule:
print('tagging key: {}, value: {}'.format(key, result.tag_set.tagging_rule[key]))
相关文档
关于设置对象标签的完整示例代码,请参见GitHub示例。
关于设置对象标签的API接口说明,请参见PutObjectTagging。