全部产品
阿里云办公

管理文件

更新时间:2018-07-20 16:55:38

您可以通过一系列的接口管理存储空间(Bucket)下的文件(Object),包括以下操作:

判断文件是否存在

以下代码用于判断指定的文件是否存在:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州为例,其它Region请按实际情况填写。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. exist = bucket.object_exists('<yourObjectName>')
  8. # 返回值为true表示文件存在,false表示文件不存在。
  9. if exist:
  10. print('object exist')
  11. else:
  12. print('object not eixst')

管理文件访问权限

文件的访问权限(ACL)有以下四种:

访问权限 描述 访问权限值
继承Bucket 文件遵循存储空间的访问权限。 oss2.OBJECT_ACL_DEFAULT
私有 文件的拥有者和授权用户有该文件的读写权限,其他用户没有权限操作该文件。 oss2.OBJECT_ACL_PRIVATE
公共读 文件的拥有者和授权用户有该文件的读写权限,其他用户只有文件的读权限。请谨慎使用该权限。 oss2.OBJECT_ACL_PUBLIC_READ
公共读写 所有用户都有该文件的读写权限。请谨慎使用该权限。 oos2.OBJECT_ACL_PUBLIC_READ_WRITE

文件的访问权限优先级高于存储空间的访问权限。例如存储空间的访问权限是私有,而文件的访问权限是公共读写,则所有用户都有该文件的读写权限。如果某个文件没有设置过访问权限,则遵循存储空间的访问权限。

设置文件访问权限

以下代码用于设置指定文件的访问权限:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州为例,其它Region请按实际情况填写。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. # 设置文件的访问权限。
  8. bucket.put_object_acl('<yourObjectName>', oss2.OBJECT_ACL_PUBLIC_READ)

获取文件访问权限

以下代码用于获取文件访问权限:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州为例,其它Region请按实际情况填写。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. print(bucket.get_object_acl('<yourObjectName>').acl)

管理文件元信息

文件元信息(Object Meta)详情请参见文件元信息

设置HTTP header

OSS允许自定义HTTP header。

以下代码用于设置HTTP header:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州为例,其它Region请按实际情况填写。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. bucket.put_object('<yourObjectName>', '{"age": 1}', headers={'Content-Type': 'application/json; charset=utf-8'})

HTTP header详情请参见RFC2616

设置自定义元信息

您可以自定义文件的元信息来对文件进行描述。

以下代码用于设置文件的自定义元信息:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州为例,其它Region请按实际情况填写。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. bucket.put_object('<yourObjectName>', 'a novel', headers={'x-oss-meta-author': 'O. Henry'})

修改元信息

以下代码用于修改文件元信息:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州为例,其它Region请按实际情况填写。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. bucket.update_object_meta('<yourObjectName>', {'x-oss-meta-author': 'O. Henry'})
  8. # 每次调用bucket.update_object_meta都会清空之前设置的值。
  9. bucket.update_object_meta('<yourObjectName>', {'x-oss-meta-price': '100 dollar'})

以下代码用于更改Content-Type等元信息:

  1. bucket.update_object_meta('<yourObjectName>', {'x-oss-meta-author': 'O. Henry'})
  2. # 每次调用bucket.update_object_meta都会清空之前设置的值。
  3. bucket.update_object_meta('<yourObjectName>', {'Content-Type': 'text/plain'})

列举文件

OSS文件按照字母顺序排列。Python SDK提供了一系列列举文件的方法。

简单列举

以下代码用于列举指定存储空间下的10个文件:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. from itertools import islice
  4. # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  5. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  6. # Endpoint以杭州为例,其它Region请按实际情况填写。
  7. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  8. for b in islice(oss2.ObjectIterator(bucket), 10):
  9. print(b.key)

列举指定前缀的文件

以下代码用于列举包含指定前缀(prefix)的文件:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州为例,其它Region请按实际情况填写。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. # 列举包含指定前缀的文件。默认列举100个文件。
  8. for obj in oss2.ObjectIterator(bucket, prefix = 'img-'):
  9. print(obj.key)

列举存储空间下所有文件

以下代码用于列举指定存储空间下的所有文件:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州为例,其它Region请按实际情况填写。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. # 设置Delimiter参数为正斜线(/)。
  8. for obj in oss2.ObjectIterator(bucket, delimiter = '/'):
  9. # 通过is_prefix方法判断obj是否为文件夹。
  10. if obj.is_prefix(): # 文件夹
  11. print('directory: ' + obj.key)
  12. else: # 文件
  13. print('file: ' + obj.key)

删除文件

删除单个文件

以下代码用于删除单个文件:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州为例,其它Region请按实际情况填写。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. bucket.delete_object('<yourObjectName>')

删除多个文件

以下代码用于批量删除文件:

  1. # 批量删除3个文件。每次最多删除1000个文件。
  2. result = bucket.batch_delete_objects(['<yourObjectName-a>', '<yourObjectName-b>', '<yourObjectName-c>'])
  3. # 打印成功删除的文件名。
  4. print('\n'.join(result.deleted_keys))

拷贝文件

您可以通过拷贝方法将文件从一个存储空间(源存储空间)复制到同一地域的另一个存储空间(目标存储空间)中。

拷贝时限制条件如下:

  • 用户有源文件的读写权限。
  • 不支持跨地域拷贝。例如,不支持将杭州存储空间里的文件拷贝到青岛。

简单拷贝

对于小于1GB的文件,您可以使用简单拷贝:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州为例,其它Region请按实际情况填写。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourDestinationBucketName>')
  7. bucket.copy_object('<yourSourceBucketName>', '<yourSourceObjectName>', '<yourDestinationObjectName>')

拷贝大文件

对于大于1GB的文件,需要使用分片拷贝。分片拷贝分为三步:

  1. 通过bucket.init_multipart_upload初始化分片拷贝任务。
  2. 通过bucket.upload_part_copy进行分片拷贝。除最后一个分片外,其它分片都要大于100KB。
  3. 通过bucket.complete_multipart_copy提交分片拷贝任务。

以下代码用于分片拷贝:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. from oss2.models import PartInfo
  4. from oss2 import determine_part_size
  5. # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  6. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  7. # Endpoint以杭州为例,其它Region请按实际情况填写。
  8. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  9. src_object = '<yourSourceObjectName>'
  10. dst_object = '<yourDestinationObjectName>'
  11. bucket.put_object(src_object, 'a' * (1024 * 1024 + 100))
  12. total_size = bucket.head_object(src_object).content_length
  13. part_size = determine_part_size(total_size, preferred_size=100 * 1024)
  14. # 初始化分片。
  15. upload_id = bucket.init_multipart_upload(dst_object).upload_id
  16. parts = []
  17. # 逐个分片拷贝。
  18. part_number = 1
  19. offset = 0
  20. while offset < total_size:
  21. num_to_upload = min(part_size, total_size - offset)
  22. byte_range = (offset, offset + num_to_upload - 1)
  23. result = bucket.upload_part_copy(bucket.bucket_name, src_object, byte_range,dst_object, upload_id, part_number)
  24. parts.append(PartInfo(part_number, result.etag))
  25. offset += num_to_upload
  26. part_number += 1
  27. # 完成分片拷贝。
  28. bucket.complete_multipart_upload(dst_object, upload_id, parts)

解冻归档文件

归档类型(Archive)的文件需要解冻(Restore)之后才能读取。非归档类型的文件,不要调用restore_object方法。

归档文件的状态变换过程如下:

  1. 归档类型的文件初始时处于冷冻状态。
  2. 提交解冻操作后,服务端执行解冻,文件处于解冻中的状态。
  3. 完成解冻后,可以读取文件。解冻状态默认持续1天,最多延长7天,之后文件又回到冷冻状态。

以下代码用于解冻归档文件:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州为例,其它Region请按实际情况填写。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. objectName = '<yourObjectName>'
  8. bucket.restore_object(objectName)

归档存储类型的详细说明请参见存储类型介绍

管理符号链接

创建符号链接

符号链接是一种特殊的文件,它指向某个具体的文件,类似于Windows上使用的快捷方式。

以下代码用于创建符号链接:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州为例,其它Region请按实际情况填写。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. objectName = '<yourObjectName>'
  8. symlink = "<yourSymlink>";
  9. bucket.put_symlink(objectName, symlink)

符号链接的详细信息请参见PutSymlink

获取符号链接指向的文件内容

获取符号链接要求您对该符号链接有读权限。以下代码用于获取符号链接指向的文件内容:

  1. # -*- coding: utf-8 -*-
  2. import oss2
  3. # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  4. auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
  5. # Endpoint以杭州为例,其它Region请按实际情况填写。
  6. bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
  7. symlink = "<yourSymlink>";
  8. bucket.get_symlink(symlink)

符号链接的详细信息请参见GetSymlink

本文导读目录