全部产品
对象存储 OSS

管理文件

更新时间:2017-06-13 11:34:30   分享:   

通过Python SDK,用户可以罗列、删除、拷贝文件,也可以查看文件信息,更改文件元信息等。

罗列文件

Python SDK提供了一系列的迭代器,用于列举文件、分片上传等。

简单罗列

列举Bucket里的10个文件:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. from itertools import islice
  4. auth = oss2.Auth('您的AccessKeyId', '您的AccessKeySecret')
  5. bucket = oss2.Bucket(auth, '您的Endpoint', '您的Bucket名')
  6. for b in islice(oss2.ObjectIterator(bucket), 10):
  7. print(b.key)

按前缀罗列

只列举前缀为”img-“的所有文件:

  1. for obj in oss2.ObjectIterator(bucket, prefix='img-'):
  2. print(obj.key)

模拟文件夹功能

OSS的存储空间(Bucket)本身是扁平结构的,并没有文件夹或目录的概念。用户可以通过在文件名里加入”/“来模拟文件夹。在列举的时候,则要设置delimiter参数(目录分隔符)为”/“,并通过是否为“公共前缀”来判断是否为文件夹。具体请参考模拟文件夹功能

罗列“根目录”下的所有内容:

  1. for obj in oss2.ObjectIterator(bucket, delimiter='/'):
  2. if obj.is_prefix(): # 文件夹
  3. print('directory: ' + obj.key)
  4. else: # 文件
  5. print('file: ' + obj.key)

注意: 模拟罗列文件夹这个操作比较低效,不建议使用。

判断文件是否存在

通过 object_exists 判断文件是否存在。返回值为 true 文件存在,为 false 文件不存在。

  1. exist = bucket.object_exists('remote.txt')
  2. if exist:
  3. print('object exist')
  4. else:
  5. print('object not eixst')

删除文件

删除单个文件:

  1. bucket.delete_object('remote.txt')

也可以删除多个文件(不能超过1000个)。下面的代码删除三个文件,同时打印成功删除的文件名:

  1. result = bucket.batch_delete_objects(['a.txt', 'b.txt', 'c.txt'])
  2. print('\n'.join(result.deleted_keys))

拷贝文件

把Bucket名为src-bucket下的source.txt拷贝到当前Bucket的target.txt文件。

  1. bucket.copy_object('src-bucket', 'source.txt', 'target.txt')

拷贝大文件

当文件比较大时,建议使用分片拷贝的方式进行拷贝,可以避免因文件太大而超时。分片拷贝和分片上传类似,分成三步:

  1. 初始化(Bucket.init_multipart_upload):得到Upload ID。
  2. 拷贝分片(Bucket.upload_part_copy):把源文件的一部分拷贝成目标文件的一个分片。
  3. 完成分片(Bucket.complete_multipart_copy):完成分片拷贝,生成目标文件。

请参考下面的示例:

  1. from oss2.models import PartInfo
  2. from oss2 import determine_part_size
  3. src_key = 'remote.txt'
  4. dst_key = 'remote-dst.txt'
  5. bucket.put_object(src_key, 'a' * (1024 * 1024 + 100))
  6. total_size = bucket.head_object(src_key).content_length
  7. part_size = determine_part_size(total_size, preferred_size=100 * 1024)
  8. # 初始化分片
  9. upload_id = bucket.init_multipart_upload(dst_key).upload_id
  10. parts = []
  11. # 逐个分片拷贝
  12. part_number = 1
  13. offset = 0
  14. while offset < total_size:
  15. num_to_upload = min(part_size, total_size - offset)
  16. byte_range = (offset, offset + num_to_upload - 1)
  17. result = bucket.upload_part_copy(bucket.bucket_name, src_key, byte_range,
  18. dst_key, upload_id, part_number)
  19. parts.append(PartInfo(part_number, result.etag))
  20. offset += num_to_upload
  21. part_number += 1
  22. # 完成分片上传
  23. bucket.complete_multipart_upload(dst_key, upload_id, parts)

更改文件元信息

更改用户自定义元信息:

  1. bucket.update_object_meta('story.txt', {'x-oss-meta-author': 'O. Henry'})
  2. bucket.update_object_meta('story.txt', {'x-oss-meta-price': '100 dollar'})

对于用户自定义元信息(x-oss-meta-为前缀的HTTP头部),每次调用都会覆盖以前的值。就上面的例子来说,第二次调用实际上是删除了x-oss-meta-author这个自定义元信息。

也可以更改Content-Type等信息:

  1. bucket.update_object_meta('story.txt', {'Content-Type': 'text/plain'})

注意到这次调用不但修改了Content-Type,而且把原先设置的用户自定义元信息也给清除了。

查看文件访问权限

  1. print(bucket.get_object_acl('story.txt').acl)

说明: 文件的访问权限有四种:default(默认)、private(私有读写)、public-read(公共读私有写)、public-read-write(公共读写),更详细的说明请参看 Object级别权限

设置文件访问权限

把文件的访问权限设为公共读私有写:

  1. 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 。

本文导读目录
本文导读目录
以上内容是否对您有帮助?