当存储空间(Bucket)处于版本控制状态时,您可以列举该Bucket中包含的所有文件(Object)、指定前缀的文件、指定目录下的文件和子目录等。
注意事项
- 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心。
- 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见Go初始化。
- 要列举文件,您必须有
oss:ListObjectVersions
权限。具体操作,请参见为RAM用户授权自定义的权限策略。
场景说明
假设您有一个名为examplebucket的存储空间,存储空间内的文件结构如下所示:
examplebucket
└── fun
└── exampleobject.jpg
└── examplefile.txt
└── destfolder
└── image1.jpg
└── image2.png
└── srcfile.txt
└── oss.jpg
以下示例分别说明如何通过对examplebucket设置不同的列举条件,获取不同的返回结果。
有关列举文件涉及的各个参数的更多信息,请参见ListObjectVersions(GetBucketVersions)。
列举Bucket中所有Object的信息
以下代码用于列举指定Bucket中包括删除标记(Delete Marker)在内的所有Object的版本信息:
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func HandleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
func main() {
// 创建OSSClient实例。
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
client, err := oss.New("yourEndpoint","yourAccessKeyId","yourAccessKeySecret")
if err != nil {
HandleError(err)
}
// 填写Bucket名称。
bucketName := "examplebucket"
bucket,err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// 列举包括删除标记在内的所有Object。
keyMarker := oss.KeyMarker("")
// VersionIdMarker与KeyMarker参数一同使用,以指定列举的起点。
versionIdMarker := oss.VersionIdMarker("")
for {
lor, err := bucket.ListObjectVersions(keyMarker,versionIdMarker)
if err != nil {
HandleError(err)
}
// 查看Object的版本信息。
for _, dirName := range lor.ObjectVersions{
fmt.Println("Versionid:",dirName.VersionId)
fmt.Println("Key:",dirName.Key)
fmt.Println("Is Latest",dirName.IsLatest)
}
// 查看删除标记的版本信息。
for _, marker := range lor.ObjectDeleteMarkers {
fmt.Println(marker.VersionId)
fmt.Println(marker.Key)
}
// 查看列举结果是否完整。如果结果不完整,则继续列举。如果结果已完整,则退出循环。
keyMarker = oss.KeyMarker(lor.NextKeyMarker)
versionIdMarker = oss.VersionIdMarker(lor.NextVersionIdMarker)
if !lor.IsTruncated {
break
}
}
}
有关Endpoint的更多信息,请参见访问域名和数据中心。有关Bucket命名规范的更多信息,请参见存储空间(Bucket)。
返回结果:
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
列举指定前缀Object的版本信息
以下代码用于列举指定前缀Object的版本信息:
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func HandleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
func main() {
// 创建OSSClient实例。
client, err := oss.New("yourEndpoint","yourAccessKeyId","yourAccessKeySecret")
if err != nil {
HandleError(err)
}
// 填写Bucket名称。
bucketName := "examplebucket"
bucket,err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// 通过Prefix参数列举前缀为fun的Object。
prefix := oss.Prefix("fun")
keyMarker := oss.KeyMarker("")
versionIdMarker := oss.VersionIdMarker("")
for {
lor, err := bucket.ListObjectVersions(prefix,keyMarker,versionIdMarker)
if err != nil {
HandleError(err)
}
// 查看Object的版本信息。
for _, dirName := range lor.ObjectVersions{
fmt.Println("Versionid:",dirName.VersionId)
fmt.Println("Key:",dirName.Key)
fmt.Println("Is Latest",dirName.IsLatest)
}
// 查看列举结果是否完整。如果结果不完整,则继续列举。如果结果已完整,则退出循环。
keyMarker = oss.KeyMarker(lor.NextKeyMarker)
versionIdMarker = oss.VersionIdMarker(lor.NextVersionIdMarker)
if !lor.IsTruncated {
break
}
}
}
返回结果:
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
列举指定个数Object的版本信息
以下代码用于列举指定个数Object的版本信息:
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func HandleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
func main() {
// 创建OSSClient实例。
client, err := oss.New("yourEndpoint","yourAccessKeyId","yourAccessKeySecret")
if err != nil {
HandleError(err)
}
// 填写Bucket名称。
bucketName := "examplebucket"
bucket,err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// 通过MaxKeys参数指定最多返回4个结果,按Object名称的字母序依次返回。
maxkey := oss.MaxKeys(4)
keyMarker := oss.KeyMarker("")
versionIdMarker := oss.VersionIdMarker("")
for {
lor, err := bucket.ListObjectVersions(maxkey,keyMarker,versionIdMarker)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 查看Object的版本信息。
for _, dirName := range lor.ObjectVersions{
fmt.Println("Versionid:",dirName.VersionId)
fmt.Println("Key:",dirName.Key)
fmt.Println("Is Latest",dirName.IsLatest)
}
// 查看列举结果是否完整。如果结果不完整,则继续列举。如果结果已完整,则退出循环。
keyMarker = oss.KeyMarker(lor.NextKeyMarker)
versionIdMarker = oss.VersionIdMarker(lor.NextVersionIdMarker)
if !lor.IsTruncated {
break
}
}
}
返回结果:
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
分页列举所有Object的版本信息
以下代码用于分页列举所有Object的版本信息:
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func HandleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
func main() {
// 创建OSSClient实例。
client, err := oss.New("yourEndpoint","yourAccessKeyId","yourAccessKeySecret")
if err != nil {
HandleError(err)
}
// 填写Bucket名称。
bucketName := "examplebucket"
bucket,err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// 分页列举所有Object。
keyMarker := oss.KeyMarker("")
// 通过MaxKeys参数指定最多返回4个结果,按Object名称的字母序依次返回。
maxkey := oss.MaxKeys(4)
versionIdMarker := oss.VersionIdMarker("")
for {
lor, err := bucket.ListObjectVersions(maxkey,keyMarker,versionIdMarker)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 查看Object的版本信息。
for _, dirName := range lor.ObjectVersions{
fmt.Println("Versionid:",dirName.VersionId)
fmt.Println("Key:",dirName.Key)
fmt.Println("Is Latest",dirName.IsLatest)
}
fmt.Println("---------------")
// 查看列举结果是否完整。如果结果不完整,则继续列举。如果结果已完整,则退出循环。
if lor.IsTruncated {
keyMarker = oss.KeyMarker(lor.NextKeyMarker)
versionIdMarker = oss.VersionIdMarker(lor.NextVersionIdMarker)
}else{
break
}
}
}
返回结果:
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
---------------
模拟文件夹列举文件
OSS没有文件夹的概念,所有元素都是以文件来存储。创建文件夹本质上来说是创建了一个大小为0并以正斜线(/)结尾的文件。这个文件可以被上传和下载,控制台会对以正斜线(/)结尾的文件以文件夹的方式展示。
通过delimiter和prefix两个参数可以模拟文件夹功能:
- 如果设置prefix为某个文件夹名称,则会列举以此prefix开头的文件,即该文件夹下所有的文件和子文件夹(目录)均显示为Object。
- 如果在设置了prefix的情况下,将delimiter设置为正斜线(/),则只列举该文件夹下的文件和子文件夹(目录),该文件夹下的子文件夹(目录)显示为CommonPrefixes,子文件夹下的文件和文件夹不显示。
以下示例说明了如何通过模拟文件夹的方式列举文件。
- 列举根目录下的Object的版本信息
以下代码用于列举根目录下的Object的版本信息:
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func HandleError(err error) { fmt.Println("Error:", err) os.Exit(-1) } func main() { // 创建OSSClient实例。 client, err := oss.New("yourEndpoint","yourAccessKeyId","yourAccessKeySecret") if err != nil { HandleError(err) } // 填写Bucket名称。 bucketName := "examplebucket" bucket,err := client.Bucket(bucketName) if err != nil { HandleError(err) } // 通过指定delimiter为正斜线(/),实现列举根目录下的Object的版本信息以及文件夹名称。 delimiter := oss.Delimiter("/") keyMarker := oss.KeyMarker("") versionIdMarker := oss.VersionIdMarker("") for { lor, err := bucket.ListObjectVersions(keyMarker,delimiter,versionIdMarker) if err != nil { HandleError(err) } // 查看Object的版本信息。 for _, dirName := range lor.ObjectVersions{ fmt.Println("Versionid:",dirName.VersionId) fmt.Println("Key:",dirName.Key) fmt.Println("Is Latest",dirName.IsLatest) } // 查看以正斜线(/)结尾的文件夹名称。 for _,common_prefix := range lor.CommonPrefixes{ fmt.Println("common_prefix:",common_prefix) } // 查看列举结果是否完整。如果结果不完整,则继续列举。如果结果已完整,则退出循环。 if lor.IsTruncated { keyMarker = oss.KeyMarker(lor.NextKeyMarker) versionIdMarker = oss.VersionIdMarker(lor.NextVersionIdMarker) }else{ break } } }
返回结果:
Versionid: CAEQChiBgIDMgdbEthciIDUyMGI0NmZlNThkODQwY2ZhNmZhNTQ1Njk4ZTdj**** Key: oss.jpg Is Latest true Versionid: CAEQChiBgICIgdbEthciIDdlM2Q1YjYxZDIyZDQyMzI4MTRkNzVmYzdiMTBh**** Key: srcfile.txt Is Latest true common_prefix: fun/
- 列举目录下的文件和子目录
以下代码用于列举指定目录下的文件和子目录:
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func HandleError(err error) { fmt.Println("Error:", err) os.Exit(-1) } func main() { // 创建OSSClient实例。 client, err := oss.New("yourEndpoint","yourAccessKeyId","yourAccessKeySecret") if err != nil { HandleError(err) } // 填写Bucket名称。 bucketName := "examplebucket" bucket,err := client.Bucket(bucketName) if err != nil { HandleError(err) } // 设置Prefix参数来获取fun目录下的所有文件与文件夹,同时设置delimiter参数为正斜线(/)作为文件夹的分隔符。 prefix := oss.Prefix("fun/") delimiter := oss.Delimiter("/") keyMarker := oss.KeyMarker("") versionIdMarker := oss.VersionIdMarker("") for { lor, err := bucket.ListObjectVersions(prefix,delimiter,keyMarker,versionIdMarker) if err != nil { HandleError(err) } // 查看Object的版本信息。 for _, dirName := range lor.ObjectVersions{ fmt.Println("Versionid:",dirName.VersionId) fmt.Println("Key:",dirName.Key) fmt.Println("Is Latest:",dirName.IsLatest) } // 查看以正斜线(/)结尾的文件夹名称。 for _,common_prefix := range lor.CommonPrefixes{ fmt.Println("common_prefix:",common_prefix) } // 查看列举结果是否完整。如果结果不完整,则继续列举。如果结果已完整,则退出循环。 if lor.IsTruncated { keyMarker = oss.KeyMarker(lor.NextKeyMarker) versionIdMarker = oss.VersionIdMarker(lor.NextVersionIdMarker) }else{ break } } }
返回结果:
Versionid: CAEQChiBgIDHzNPEthciIDYzZGQ5M2VjOTU2ODRmMzA4ZWM4ODk0NjVmMWEx**** Key: fun/ Is Latest: true Versionid: CAEQChiBgICditzEthciIDBiNTg1ZTZkMDRlMzRjNDdiMjRjMTBlOGUzMTM0**** Key: fun/examplefile.txt Is Latest: true Versionid: CAEQChiBgMC.itzEthciIDEzNWVlYjNhYzNmMjQ4NWM5Nzc2NzllY2FiYmQ3**** Key: fun/exampleobject.jpg Is Latest: true common_prefix: fun/destfolder/