本文介紹如何在開啟版本控制狀態下列舉儲存空間下(Bucket)的所有檔案(Object)、指定個數的檔案、指定首碼的檔案等。
注意事項
本文以華東1(杭州)外網Endpoint為例。如果您希望通過與OSS同地區的其他阿里雲產品訪問OSS,請使用內網Endpoint。關於OSS支援的Region與Endpoint的對應關係,請參見OSS訪問網域名稱、資料中心、開放連接埠。
本文以從環境變數讀取存取憑證為例。如何配置訪問憑證,請參見配置訪問憑證。
本文以OSS網域名稱建立OSSClient為例。如果您希望通過自訂網域名、STS等方式建立OSSClient,請參見初始化。
要列舉檔案,您必須有
oss:ListObjectVersions
許可權。具體操作,請參見為RAM使用者授權自訂的權限原則。
列舉Bucket中所有Object的資訊
以下代碼用於列舉指定Bucket中包括刪除標記(Delete Marker)在內的所有Object的版本資訊:
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 開啟Bucket版本控制後,調用list_object_versions介面返回不同版本的Object資訊。
# 列舉Bucket中包括刪除標記(Delete Marker)在內的所有Object的版本資訊。
result = bucket.list_object_versions()
# 列舉所有Object的版本資訊。
next_key_marker = None
next_versionid_marker = None
while True:
result = bucket.list_object_versions(key_marker=next_key_marker, versionid_marker=next_versionid_marker)
# 查看列舉Object的版本資訊。
for version_info in result.versions:
print('version_info.versionid:', version_info.versionid)
print('version_info.key:', version_info.key)
print('version_info.is_latest:', version_info.is_latest)
# 查看列舉刪除標記的版本資訊。
for del_maker_Info in result.delete_marker:
print('del_maker.key:', del_maker_Info.key)
print('del_maker.versionid:', del_maker_Info.versionid)
print('del_maker.is_latest:', del_maker_Info.is_latest)
is_truncated = result.is_truncated
# 查看列舉結果是否完整。如果結果不完整,則繼續羅列。如果結果已完整,則退出迴圈。
if is_truncated:
next_key_marker = result.next_key_marker
next_versionid_marker = result.next_versionid_marker
else:
break
列舉指定首碼Object的版本資訊
以下代碼用於列舉指定首碼Object的版本資訊:
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 開啟Bucket版本控制後,調用list_object_versions介面返回不同版本的Object資訊。
# 列舉Bucket中包括刪除標記(Delete Marker)在內的所有Object的版本資訊。
result = bucket.list_object_versions()
# 指定列舉以test-為首碼的Object的版本資訊。
prefix = 'test-'
next_key_marker = None
next_versionid_marker = None
while True:
result = bucket.list_object_versions(prefix=prefix, key_marker=next_key_marker, versionid_marker=next_versionid_marker)
# 查看列舉的Object版本資訊。
for version_info in result.versions:
print('version_info.versionid:', version_info.versionid)
print('version_info.key:', version_info.key)
print('version_info.is_latest:', version_info.is_latest)
# 查看列舉的刪除標記版本資訊。
for del_maker_Info in result.delete_marker:
print('del_maker.key:', del_maker_Info.key)
print('del_maker.versionid:', del_maker_Info.versionid)
print('del_maker.is_latest:', del_maker_Info.is_latest)
is_truncated = result.is_truncated
# 查看列舉結果是否完整。如果結果不完整,則繼續羅列。如果結果已完整,則退出迴圈。
if is_truncated:
next_key_marker = result.next_key_marker
next_versionid_marker = result.next_versionid_marker
else:
break
列舉指定個數Object的版本資訊
以下代碼用於列舉指定個數Object的版本資訊:
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫儲存空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 開啟Bucket版本控制後,調用list_object_versions介面返回不同版本的Object資訊。
# 列舉Bucket中包括刪除標記(Delete Marker)在內的所有Object的版本資訊。
result = bucket.list_object_versions()
# 指定本次最多返回200個結果。
max_keys = 200
result = bucket.list_object_versions(max_keys=max_keys)
# 查看列舉的Object版本資訊。
for version_info in result.versions:
print('version_info.versionid:', version_info.versionid)
print('version_info.key:', version_info.key)
print('version_info.is_latest:', version_info.is_latest)
# 查看列舉的Object刪除標記的版本資訊。
for del_maker_Info in result.delete_marker:
print('del_maker.key:', del_maker_Info.key)
print('del_maker.versionid:', del_maker_Info.versionid)
print('del_maker.is_latest:', del_maker_Info.is_latest)
# 查看列舉結果是否有截斷。
# 由於指定本次列舉最多返回200個結果,若Bucket中Object的個數超過200,則列舉結果存在截斷,即is_truncated為True。若Bucket中Object的個數少於200,則列舉結果沒有截斷,即is_truncated為False。
print('is truncated', result.is_truncated)
檔案夾功能
OSS沒有檔案夾的概念,所有元素都是以檔案來儲存。建立檔案夾本質上來說是建立了一個大小為0並以正斜線(/)結尾的檔案。這個檔案可以被上傳和下載,控制台會對以正斜線(/)結尾的檔案以檔案夾的方式展示。
通過delimiter和prefix兩個參數可以類比檔案夾功能:
如果設定prefix為某個檔案夾名稱,則會列舉以此prefix開頭的檔案,即該檔案夾下所有的檔案和子檔案夾(目錄)均顯示為Object。
如果在設定了prefix的情況下,將delimiter設定為正斜線(/),則只列舉該檔案夾下的檔案和子檔案夾(目錄),該檔案夾下的子檔案夾(目錄)顯示為CommonPrefixes,子檔案夾下的檔案和檔案夾不顯示。
假設儲存空間(examplebucket)中包含檔案oss.jpg、fun/test.jpg、fun/movie/001.avi和fun/movie/007.txt,以正斜線(/)作為檔案夾的分隔字元。檔案結構如下:
examplebucket
└── oss.jpg
└── fun
└── test.jpg
└── movie
└── 001.avi
└── 007.txt
以下樣本說明了如何通過類比檔案夾的方式列舉檔案。
列舉根目錄下的Object的版本資訊
以下代碼用於列舉根目錄下的Object的版本資訊:
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider()) # 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 endpoint = "https://oss-cn-hangzhou.aliyuncs.com" # 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數 region = "cn-hangzhou" # yourBucketName填寫儲存空間名稱。 bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region) # 開啟Bucket版本控制後,調用list_object_versions介面返回不同版本的Object資訊。 # 列舉Bucket中包括刪除標記(Delete Marker)在內的所有Object的版本資訊。 result = bucket.list_object_versions() # 指定delimiter為正斜線(/)。 delimiter = "/" next_key_marker = None next_versionid_marker = None while True: result = bucket.list_object_versions(delimiter=delimiter, key_marker=next_key_marker, versionid_marker=next_versionid_marker) # 查看列舉的Object版本資訊。 for version_info in result.versions: print('version_info.versionid:', version_info.versionid) print('version_info.key:', version_info.key) print('version_info.is_latest:', version_info.is_latest) # 查看列舉的刪除標記版本資訊。 for del_maker_Info in result.delete_marker: print('del_maker.key:', del_maker_Info.key) print('del_maker.versionid:', del_maker_Info.versionid) print('del_maker.is_latest:', del_maker_Info.is_latest) # 查看以正斜線(/)結尾的目錄名稱。 for common_prefix in result.common_prefix: print("common_prefix:", common_prefix) is_truncated = result.is_truncated # 查看列舉結果是否完整。如果結果不完整,則繼續羅列。如果結果已完整,則退出迴圈。 if is_truncated: next_key_marker = result.next_key_marker next_versionid_marker = result.next_versionid_marker else: break
返回結果:
('version_info.versionid:', 'CAEQEhiBgMCw8Y7FqBciIGIzMDE3MTEzOWRiMDRmZmFhMmRlMjljZWI0MWU4****') ('version_info.key:', 'oss.jpg') ('version_info.is_latest:', True) ('common_prefix:', 'fun/')
列舉目錄下的檔案和子目錄
以下代碼用於列舉指定目錄下的檔案和子目錄:
# -*- coding: utf-8 -*- import oss2 from oss2.credentials import EnvironmentVariableCredentialsProvider # 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider()) # 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 endpoint = "https://oss-cn-hangzhou.aliyuncs.com" # 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數 region = "cn-hangzhou" # yourBucketName填寫儲存空間名稱。 bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region) # 開啟Bucket版本控制後,調用list_object_versions介面返回不同版本的Object資訊。 # 列出Bucket中包括刪除標記(Delete Marker)在內的所有Object的版本資訊。 result = bucket.list_object_versions() # 指定delimiter為正斜線(/),prefix為fun/。 prefix = "fun/" delimiter = "/" next_key_marker = None next_versionid_marker = None while True: result = bucket.list_object_versions(prefix=prefix, delimiter=delimiter, key_marker=next_key_marker, versionid_marker=next_versionid_marker) # 查看列舉的Object版本資訊。 for version_info in result.versions: print('version_info.versionid:', version_info.versionid) print('version_info.key:', version_info.key) print('version_info.is_latest:', version_info.is_latest) # 查看列舉的刪除標記的版本資訊。 for del_maker_Info in result.delete_marker: print('del_maker.key:', del_maker_Info.key) print('del_maker.versionid:', del_maker_Info.versionid) print('del_maker.is_latest:', del_maker_Info.is_latest) # 查看以正斜線(/)結尾的檔案夾名稱。 for common_prefix in result.common_prefix: print("common_prefix:", common_prefix) is_truncated = result.is_truncated # 查看列舉結果是否完整。如果結果不完整,則繼續羅列。如果結果已完整,則退出迴圈。 if is_truncated: next_key_marker = result.next_key_marker next_versionid_marker = result.next_versionid_marker else: break
返回結果:
('version_info.versionid:', 'CAEQFRiBgMCh9JDkrxciIGE3OTNkYzFhYTc2YzQzOTQ4Y2MzYjg2YjQ4ODg*****') ('version_info.key:', 'fun/test.jpg') ('version_info.is_latest:', True) ('commonPrefix:', 'fun/movie/')
相關文檔
關於列舉檔案的API介面說明,請參見ListObjectVersions(GetBucketVersions)。