通过Python SDK,用户可以罗列、删除、拷贝文件,也可以查看文件信息,更改文件元信息等。
罗列文件
Python SDK提供了一系列的迭代器,用于列举文件、分片上传等。
简单罗列
列举Bucket里的10个文件:
- # -*- coding: utf-8 -*-
- import oss2
- from itertools import islice
- auth = oss2.Auth('您的AccessKeyId', '您的AccessKeySecret')
- bucket = oss2.Bucket(auth, '您的Endpoint', '您的Bucket名')
- for b in islice(oss2.ObjectIterator(bucket), 10):
- print(b.key)
按前缀罗列
只列举前缀为”img-“的所有文件:
- for obj in oss2.ObjectIterator(bucket, prefix='img-'):
- print(obj.key)
模拟文件夹功能
OSS的存储空间(Bucket)本身是扁平结构的,并没有文件夹或目录的概念。用户可以通过在文件名里加入”/“来模拟文件夹。在列举的时候,则要设置delimiter参数(目录分隔符)为”/“,并通过是否为“公共前缀”来判断是否为文件夹。具体请参考
模拟文件夹功能。
罗列“根目录”下的所有内容:
- for obj in oss2.ObjectIterator(bucket, delimiter='/'):
- if obj.is_prefix(): # 文件夹
- print('directory: ' + obj.key)
- else: # 文件
- print('file: ' + obj.key)
注意: 模拟罗列文件夹这个操作比较低效,不建议使用。
判断文件是否存在
通过 object_exists 判断文件是否存在。返回值为 true 文件存在,为 false 文件不存在。
- exist = bucket.object_exists('remote.txt')
- if exist:
- print('object exist')
- else:
- print('object not eixst')
删除文件
删除单个文件:
- bucket.delete_object('remote.txt')
也可以删除多个文件(不能超过1000个)。下面的代码删除三个文件,同时打印成功删除的文件名:
- result = bucket.batch_delete_objects(['a.txt', 'b.txt', 'c.txt'])
- print('\n'.join(result.deleted_keys))
拷贝文件
把Bucket名为src-bucket下的source.txt拷贝到当前Bucket的target.txt文件。
- bucket.copy_object('src-bucket', 'source.txt', 'target.txt')
拷贝大文件
当文件比较大时,建议使用分片拷贝的方式进行拷贝,可以避免因文件太大而超时。分片拷贝和分片上传类似,分成三步:
- 初始化(Bucket.init_multipart_upload):得到Upload ID。
- 拷贝分片(Bucket.upload_part_copy):把源文件的一部分拷贝成目标文件的一个分片。
- 完成分片(Bucket.complete_multipart_copy):完成分片拷贝,生成目标文件。
请参考下面的示例:
- from oss2.models import PartInfo
- from oss2 import determine_part_size
- src_key = 'remote.txt'
- dst_key = 'remote-dst.txt'
- bucket.put_object(src_key, 'a' * (1024 * 1024 + 100))
- total_size = bucket.head_object(src_key).content_length
- part_size = determine_part_size(total_size, preferred_size=100 * 1024)
- # 初始化分片
- upload_id = bucket.init_multipart_upload(dst_key).upload_id
- parts = []
- # 逐个分片拷贝
- part_number = 1
- offset = 0
- while offset < total_size:
- num_to_upload = min(part_size, total_size - offset)
- byte_range = (offset, offset + num_to_upload - 1)
- result = bucket.upload_part_copy(bucket.bucket_name, src_key, byte_range,
- dst_key, upload_id, part_number)
- parts.append(PartInfo(part_number, result.etag))
- offset += num_to_upload
- part_number += 1
- # 完成分片上传
- bucket.complete_multipart_upload(dst_key, upload_id, parts)
更改文件元信息
更改用户自定义元信息:
- bucket.update_object_meta('story.txt', {'x-oss-meta-author': 'O. Henry'})
- bucket.update_object_meta('story.txt', {'x-oss-meta-price': '100 dollar'})
对于用户自定义元信息(x-oss-meta-为前缀的HTTP头部),每次调用都会覆盖以前的值。就上面的例子来说,第二次调用实际上是删除了x-oss-meta-author这个自定义元信息。
也可以更改Content-Type等信息:
- bucket.update_object_meta('story.txt', {'Content-Type': 'text/plain'})
注意到这次调用不但修改了Content-Type,而且把原先设置的用户自定义元信息也给清除了。
查看文件访问权限
- print(bucket.get_object_acl('story.txt').acl)
说明: 文件的访问权限有四种:default(默认)、private(私有读写)、public-read(公共读私有写)、public-read-write(公共读写),更详细的说明请参看
Object级别权限 。
设置文件访问权限
把文件的访问权限设为公共读私有写:
- bucket.put_object_acl('story.txt', oss2.OBJECT_ACL_PUBLIC_READ)
说明: 文件的访问权限有四种:default(默认)、private(私有读写)、public-read(公共读私有写)、public-read-write(公共读写),分别对应oss2.OBJECT_ACL_DEFAULT、oss2.OBJECT_ACL_PRIVATE、oss2.OBJECT_ACL_PUBLIC_READ、oss2.OBJECT_ACL_PUBLIC_READ_WRITE 。