管理对象

MSS Python SDK 提供了若干对象管理的接口,诸如:列举对象、删除对象、拷贝对象以及更改对象元信息等。

列举

MSS Python SDK 提供了若干迭代器,通过这些迭代器可以对 MSS 中指定的 bucket 进行对象列举。

简单列举

简单列举是指不进行筛选列举指定 bucket 中的所有对象,可以直接通过 mssapi.s3.bucket.Bucket 进行列举:

b0 = conn.get_bucket('您需要列举的bucket名字')

key_names = [key.name for ky in b0]
print key_names

也可以使用 mssapi.s3.bucket.Bucket.list 接口进行对象列举:

b0 = conn.get_bucket('您需要列举的bucket名字')

for key in b0.list:
    print key.name

文件夹模拟

BucketListResultSet 通过 prefix、delimiter 和 marker 来实现复杂的对象列举方式,也可以实现模拟文件夹的功能,详情参考 MSS ListObject API。
假设 MSS 的 test_list bucket 中存在以下对象:
tmp01/00/a
tmp01/00/b
tmp01/11
tmp01/12/a
tmp01/12/b
tmp00
tmp00/00
tmp00/01
那么文件夹遍历的例子如下:

b0 = conn.get_bucket('您要遍历的桶')

biter = b0.list(delimiter = '/')
dirs = ['']
while len(dirs) > 0:
    new_dirs = []
    # 列举所有子文件夹
    for dir in dirs:
        # 列举其中的一个子文件夹
        biter = b0.list(prefix = dir, delimiter = '/')
        for item in biter:
            # 判断是文件还是文件夹?
            if isinstance(item, mssapi.s3.key.Key):
                print item.name
            else:
                new_dirs.append(item.name)
    # 还有子文件夹需要列举
    dirs = new_dirs

“”“ 输出结果:
tmp00
tmp00/00
tmp00/01
tmp01/11
tmp01/00/a
tmp01/00/b
tmp01/12/a
tmp01/12/b
”“”

拷贝

MSS 支持同一个 bucket 甚至跨 bucket 的对象拷贝,其中利用 mssapi.s3.bucket.Bucket.copy_key 接口进行对象拷贝的例子如下:

b0 = conn.get_bucket('您的MSS bucket名字')

new_key_name = '拷贝的目标对象名字'
src_bucket_name = '拷贝的源对象所属bucket名字'
src_key_name = '拷贝的源对象名字'

# 拷贝新文件到b0
new_key = b0.copy_key(new_key_name, src_bucket_name, src_key_name)

print new_key.name

mssapi.s3.bucket.Bucket.copy_key 接口参数:

参数 类型 默认值 必选 注释
new_key_name string - 拷贝目标对象名字,注意:同一个 bucket 其他重名对象会被覆盖
src_bucket_name string - 拷贝源对象所属 bucket 名字,必须存在
src_key_name string - 拷贝源对象所属 bucket,当源和目标 bucket 不一致时,进行跨 bucket 拷贝
metadata dict None 对象元信息:
设置:全量更新目标对象的元信息为 metadata 指定的内容
不设置:不更新目标对象的元信息
headers dict None HTTP 请求头部
query_args dict None HTTP 请求额外的查询信息


也可以利用 mssapi.s3.key.Key.copy 接口来进行对象拷贝,其接口参数如下:

参数 类型 默认值 必选 注释
dst_bucket string - 拷贝目标对象的所属 bucket,当源和目标的 bucket 不一致时,进行跨 bucket 拷贝
dst_key string - 拷贝目标对象名字,注意:同一个 bucket 其他重名对象会被覆盖
metadata dict None 对象元信息:
设置:全量更新目标对象的元信息为 metadata 指定的内容
不设置:不更新目标对象的元信息
validate_dst_bucket bool True 检查 dst_bucket 是否存在


注意:

  • 进行跨 bucket 拷贝时,必须要具有目标 bucket 的写权限
  • 也可以使用拷贝完成对象元信息的变更,但是建议使用 mssapi.s3.key.Key 类中的 remote_set_metadata 接口实现

删除

使用 mssapi.s3.bucket.Bucket.delete_key 删除:

b0.delete_key('您需要删除的对象名字')

使用 mssapi.s3.key.Key.delete 删除:

k0 = b0.get_key('您需要删除的对象名字')
k0.delete()

注意:上述两个接口,都支持携带 headers

批量删除

MSS Python SDK 支持批量删除同一个桶下的多个对象,批量删除的接口为 mssapi.s3.bucket.Bucket.delete_keys,批量删除举例:

b0 = conn.get_bucket('您要设置的桶名字')

k0 = conn.get_key('桶下的一个对象名字')

# delete_keys接口指定的keys可以是mssapi.s3.key.Key类型变量
delete_result = b0.delete_keys(['对象1', '对象2', k0, '对象4'], quiet=False)

print "删除成功的对象: %s" % delete_result.deleted
print "删除失败的对象: %s" % delete_result.errors

mssapi.s3.bucket.Bucket.delete_keys 的返回值类型为 mssapi.s3.multidelete.MultiDeleteResult,其接口参数如下:

参数 类型 默认值 必选 注释
keys list - 指定被删除的对象数组,数组元素支持对象的名字(字符串)和 mssapi.s3.key.Key 两种类型
quiet bool False 控制是否返回成功删除的 key 信息:
True:返回结果只包含删除失败的对象信息
False:返回结果包含删除成功和失败的对象信息
headers dict None HTTP请求头部

更改元信息

虽然可以通过对象拷贝方式来修改当前已经存在对象的元信息,但是建议使用 mssapi.s3.key.Key中的set_remote_metadata 接口进行修改:

import copy

# b0必须是修改对象的bucket
k0 = b0.get_key('您需要修改对象的名字')
# 和其他接口不同,set_remote_metadata使用的自定义元信息必须以'x-amz-meta-'开头
k0 = k0.set_remote_metadata(metadata_plus={'x-amz-meta-location': 'Beijing'}, metadata_minus={})
# 获取最新的元信息
k0 = b0.get_key('您需要修改对象的名字')
print k0.metadata, k0.content_type

注意: set_remote_metadata 中所有自定义元信息必须以'x-amz-meta-’开头,接口参数如下:

参数 类型 默认值 必选 注释
metadata_plus dict - 给指定 key 增加元信息,包含的自定义元信息必须以‘x-amz-meta-’开头
metadata_minus dict/set - 将指定的元信息从 key 中删除,包含的自定义元信息必须以‘x-amz-meta-’开头
headers dict None HTTP 请求头部

权限管理

MSS 中 bucket 是权限设置的基本单元,故同一个 bucket 下所有对象的权限均与 bucket 权限一致。