Go列舉文件
當(dāng)存儲(chǔ)空間(Bucket)處于版本控制狀態(tài)時(shí),您可以列舉該Bucket中包含的所有文件(Object)、指定前綴的文件、指定目錄下的文件和子目錄等。
注意事項(xiàng)
本文以華東1(杭州)外網(wǎng)Endpoint為例。如果您希望通過(guò)與OSS同地域的其他阿里云產(chǎn)品訪問(wèn)OSS,請(qǐng)使用內(nèi)網(wǎng)Endpoint。關(guān)于OSS支持的Region與Endpoint的對(duì)應(yīng)關(guān)系,請(qǐng)參見(jiàn)OSS訪問(wèn)域名、數(shù)據(jù)中心、開(kāi)放端口。
本文以從環(huán)境變量讀取訪問(wèn)憑證為例。如何配置訪問(wèn)憑證,請(qǐng)參見(jiàn)配置訪問(wèn)憑證。
本文以OSS域名新建OSSClient為例。如果您希望通過(guò)自定義域名、STS等方式新建OSSClient,請(qǐng)參見(jiàn)初始化。
要列舉文件,您必須有
oss:ListObjectVersions
權(quán)限。具體操作,請(qǐng)參見(jiàn)為RAM用戶授權(quán)自定義的權(quán)限策略。
場(chǎng)景說(shuō)明
假設(shè)您有一個(gè)名為examplebucket的存儲(chǔ)空間,存儲(chǔ)空間內(nèi)的文件結(jié)構(gòu)如下所示:
examplebucket
└── fun
└── exampleobject.jpg
└── examplefile.txt
└── destfolder
└── image1.jpg
└── image2.png
└── srcfile.txt
└── oss.jpg
以下示例分別說(shuō)明如何通過(guò)對(duì)examplebucket設(shè)置不同的列舉條件,獲取不同的返回結(jié)果。
有關(guān)列舉文件涉及的各個(gè)參數(shù)的更多信息,請(qǐng)參見(jiàn)ListObjectVersions(GetBucketVersions)。
示例代碼
以下代碼用于列舉指定Bucket中包括刪除標(biāo)記(Delete Marker)在內(nèi)的所有Object的版本信息:
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫(xiě)B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
// yourRegion填寫(xiě)B(tài)ucket所在地域,以華東1(杭州)為例,填寫(xiě)為cn-hangzhou。其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫(xiě)B(tài)ucket名稱。
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
}
// 列舉包括刪除標(biāo)記在內(nèi)的所有Object。
keyMarker := oss.KeyMarker("")
versionIdMarker := oss.VersionIdMarker("")
for {
lor, err := bucket.ListObjectVersions(keyMarker, versionIdMarker)
if err != nil {
log.Fatalf("Failed to list object versions: %v", err)
}
// 查看Object的版本信息。
for _, objVersion := range lor.ObjectVersions {
log.Printf("VersionId: %s", objVersion.VersionId)
log.Printf("Key: %s", objVersion.Key)
log.Printf("Is Latest: %t", objVersion.IsLatest)
}
// 查看刪除標(biāo)記的版本信息。
for _, deleteMarker := range lor.ObjectDeleteMarkers {
log.Printf("Delete Marker VersionId: %s", deleteMarker.VersionId)
log.Printf("Delete Marker Key: %s", deleteMarker.Key)
}
// 查看列舉結(jié)果是否完整。如果結(jié)果不完整,則繼續(xù)列舉。如果結(jié)果已完整,則退出循環(huán)。
keyMarker = oss.KeyMarker(lor.NextKeyMarker)
versionIdMarker = oss.VersionIdMarker(lor.NextVersionIdMarker)
if !lor.IsTruncated {
break
}
}
}
返回結(jié)果:
Versionid: CAEQChiBgIDHzNPEthciIDYzZGQ5M2VjOTU2ODRmMzA4ZWM4ODk0NjVmMWEx****
Key: fun/
Is Latest true
Versionid: CAEQChiBgID61tnEthciIDNmOGM2MTQ3ZjU1NTQ2MGFhYWJjNjQxMTQxZWZh****
Key: fun/destfolder/
Is Latest true
Versionid: CAEQChiBgMDczt3EthciIDEwYjliZmQ4MDNiMDQ2Njk4YWMxM2NhM2E5NzQ3****
Key: fun/destfolder/image1.jpg
Is Latest true
Versionid: CAEQChiBgIDszt3EthciIGU5OWU0ZTllMGY3NTRmMmU5NzVjZmJkYmE3ZWYy****
Key: fun/destfolder/image2.png
Is Latest true
Versionid: CAEQChiBgICditzEthciIDBiNTg1ZTZkMDRlMzRjNDdiMjRjMTBlOGUzMTM0****
Key: fun/examplefile.txt
Is Latest true
Versionid: CAEQChiBgMC.itzEthciIDEzNWVlYjNhYzNmMjQ4NWM5Nzc2NzllY2FiYmQ3****
Key: fun/exampleobject.jpg
Is Latest true
Versionid: CAEQChiBgIDMgdbEthciIDUyMGI0NmZlNThkODQwY2ZhNmZhNTQ1Njk4ZTdj****
Key: oss.jpg
Is Latest true
Versionid: CAEQChiBgICIgdbEthciIDdlM2Q1YjYxZDIyZDQyMzI4MTRkNzVmYzdiMTBh****
Key: srcfile.txt
Is Latest true
常見(jiàn)使用場(chǎng)景
列舉指定前綴Object的版本信息
以下代碼用于列舉指定前綴Object的版本信息:
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫(xiě)B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
// yourRegion填寫(xiě)B(tài)ucket所在地域,以華東1(杭州)為例,填寫(xiě)為cn-hangzhou。其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫(xiě)B(tài)ucket名稱。
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
}
// 通過(guò)Prefix參數(shù)列舉前綴為fun的Object。
prefix := oss.Prefix("fun")
keyMarker := oss.KeyMarker("")
versionIdMarker := oss.VersionIdMarker("")
for {
lor, err := bucket.ListObjectVersions(prefix, keyMarker, versionIdMarker)
if err != nil {
log.Fatalf("Failed to list object versions: %v", err)
}
// 查看Object的版本信息。
for _, objVersion := range lor.ObjectVersions {
log.Printf("VersionId: %s", objVersion.VersionId)
log.Printf("Key: %s", objVersion.Key)
log.Printf("Is Latest: %t", objVersion.IsLatest)
}
// 查看列舉結(jié)果是否完整。如果結(jié)果不完整,則繼續(xù)列舉。如果結(jié)果已完整,則退出循環(huán)。
keyMarker = oss.KeyMarker(lor.NextKeyMarker)
versionIdMarker = oss.VersionIdMarker(lor.NextVersionIdMarker)
if !lor.IsTruncated {
break
}
}
}
返回結(jié)果:
Versionid: CAEQChiBgIDHzNPEthciIDYzZGQ5M2VjOTU2ODRmMzA4ZWM4ODk0NjVmMWEx****
Key: fun/
Is Latest true
Versionid: CAEQChiBgID61tnEthciIDNmOGM2MTQ3ZjU1NTQ2MGFhYWJjNjQxMTQxZWZh****
Key: fun/destfolder/
Is Latest true
Versionid: CAEQChiBgMDczt3EthciIDEwYjliZmQ4MDNiMDQ2Njk4YWMxM2NhM2E5NzQ3****
Key: fun/destfolder/image1.jpg
Is Latest true
Versionid: CAEQChiBgIDszt3EthciIGU5OWU0ZTllMGY3NTRmMmU5NzVjZmJkYmE3ZWYy****
Key: fun/destfolder/image2.png
Is Latest true
Versionid: CAEQChiBgICditzEthciIDBiNTg1ZTZkMDRlMzRjNDdiMjRjMTBlOGUzMTM0****
Key: fun/examplefile.txt
Is Latest true
Versionid: CAEQChiBgMC.itzEthciIDEzNWVlYjNhYzNmMjQ4NWM5Nzc2NzllY2FiYmQ3****
Key: fun/exampleobject.jpg
Is Latest true
列舉指定個(gè)數(shù)Object的版本信息
以下代碼用于列舉指定個(gè)數(shù)Object的版本信息:
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫(xiě)B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
// yourRegion填寫(xiě)B(tài)ucket所在地域,以華東1(杭州)為例,填寫(xiě)為cn-hangzhou。其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫(xiě)B(tài)ucket名稱。
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
}
// 通過(guò)MaxKeys參數(shù)指定最多返回4個(gè)結(jié)果,按Object名稱的字母序依次返回。
maxKeys := oss.MaxKeys(4)
keyMarker := oss.KeyMarker("")
versionIdMarker := oss.VersionIdMarker("")
for {
lor, err := bucket.ListObjectVersions(maxKeys, keyMarker, versionIdMarker)
if err != nil {
log.Fatalf("Failed to list object versions: %v", err)
}
// 查看Object的版本信息。
for _, objVersion := range lor.ObjectVersions {
log.Printf("VersionId: %s", objVersion.VersionId)
log.Printf("Key: %s", objVersion.Key)
log.Printf("Is Latest: %t", objVersion.IsLatest)
}
// 查看列舉結(jié)果是否完整。如果結(jié)果不完整,則繼續(xù)列舉。如果結(jié)果已完整,則退出循環(huán)。
keyMarker = oss.KeyMarker(lor.NextKeyMarker)
versionIdMarker = oss.VersionIdMarker(lor.NextVersionIdMarker)
if !lor.IsTruncated {
break
}
}
}
返回結(jié)果:
Versionid: CAEQChiBgIDHzNPEthciIDYzZGQ5M2VjOTU2ODRmMzA4ZWM4ODk0NjVmMWEx****
Key: fun/
Is Latest true
Versionid: CAEQChiBgID61tnEthciIDNmOGM2MTQ3ZjU1NTQ2MGFhYWJjNjQxMTQxZWZh****
Key: fun/destfolder/
Is Latest true
Versionid: CAEQChiBgMDczt3EthciIDEwYjliZmQ4MDNiMDQ2Njk4YWMxM2NhM2E5NzQ3****
Key: fun/destfolder/image1.jpg
Is Latest true
Versionid: CAEQChiBgIDszt3EthciIGU5OWU0ZTllMGY3NTRmMmU5NzVjZmJkYmE3ZWYy****
Key: fun/destfolder/image2.png
Is Latest true
分頁(yè)列舉所有Object的版本信息
以下代碼用于分頁(yè)列舉所有Object的版本信息:
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫(xiě)B(tài)ucket對(duì)應(yīng)的Endpoint,以華東1(杭州)為例,填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
// yourRegion填寫(xiě)B(tài)ucket所在地域,以華東1(杭州)為例,填寫(xiě)為cn-hangzhou。其它Region請(qǐng)按實(shí)際情況填寫(xiě)。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫(xiě)B(tài)ucket名稱。
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
}
// 分頁(yè)列舉所有Object。
keyMarker := oss.KeyMarker("")
// 通過(guò)MaxKeys參數(shù)指定最多返回4個(gè)結(jié)果,按Object名稱的字母序依次返回。
maxKeys := oss.MaxKeys(4)
versionIdMarker := oss.VersionIdMarker("")
for {
lor, err := bucket.ListObjectVersions(maxKeys, keyMarker, versionIdMarker)
if err != nil {
log.Fatalf("Failed to list object versions: %v", err)
}
// 查看Object的版本信息。
for _, objVersion := range lor.ObjectVersions {
log.Printf("VersionId: %s", objVersion.VersionId)
log.Printf("Key: %s", objVersion.Key)
log.Printf("Is Latest: %t", objVersion.IsLatest)
}
log.Println("---------------")
// 查看列舉結(jié)果是否完整。如果結(jié)果不完整,則繼續(xù)列舉。如果結(jié)果已完整,則退出循環(huán)。
if lor.IsTruncated {
keyMarker = oss.KeyMarker(lor.NextKeyMarker)
versionIdMarker = oss.VersionIdMarker(lor.NextVersionIdMarker)
} else {
break
}
}
}
返回結(jié)果:
Versionid: CAEQChiBgIDHzNPEthciIDYzZGQ5M2VjOTU2ODRmMzA4ZWM4ODk0NjVmMWEx****
Key: fun/
Is Latest true
Versionid: CAEQChiBgID61tnEthciIDNmOGM2MTQ3ZjU1NTQ2MGFhYWJjNjQxMTQxZWZh****
Key: fun/destfolder/
Is Latest true
Versionid: CAEQChiBgMDczt3EthciIDEwYjliZmQ4MDNiMDQ2Njk4YWMxM2NhM2E5NzQ3****
Key: fun/destfolder/image1.jpg
Is Latest true
Versionid: CAEQChiBgIDszt3EthciIGU5OWU0ZTllMGY3NTRmMmU5NzVjZmJkYmE3ZWYy****
Key: fun/destfolder/image2.png
Is Latest true
---------------
Versionid: CAEQChiBgICditzEthciIDBiNTg1ZTZkMDRlMzRjNDdiMjRjMTBlOGUzMTM0****
Key: fun/examplefile.txt
Is Latest true
Versionid: CAEQChiBgMC.itzEthciIDEzNWVlYjNhYzNmMjQ4NWM5Nzc2NzllY2FiYmQ3****
Key: fun/exampleobject.jpg
Is Latest true
Versionid: CAEQChiBgIDMgdbEthciIDUyMGI0NmZlNThkODQwY2ZhNmZhNTQ1Njk4ZTdj****
Key: oss.jpg
Is Latest true
Versionid: CAEQChiBgICIgdbEthciIDdlM2Q1YjYxZDIyZDQyMzI4MTRkNzVmYzdiMTBh****
Key: srcfile.txt
Is Latest true
---------------
相關(guān)文檔
關(guān)于列舉Bucket中所有Object的版本信息的API接口說(shuō)明,請(qǐng)參見(jiàn)ListObjectVersions。