阿里雲團隊努力不懈,力求將最新的技術內容更快地以您最熟悉的語言呈現。本文由簡體中文內容自動轉碼而成,過程無人工干預。阿里雲不保證此自動轉碼的準確性、完整性及時效性。因轉碼造成的任何內容錯誤及因此可能帶來的損失,阿里雲概不負責,敬請見諒。本文内容請以簡體中文版本為準。
全部產品
Search
文件中心

管理檔案

更新時間: Oct 19, 2018

您可以通過一系列的介面管理儲存空間(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)

Archive Storage類型的詳細說明請參見儲存類型介紹

管理符號連結

建立符號連結

符號連結是一種特殊的檔案,它指向某個具體的檔案,類似於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