当存储空间(Bucket)处于版本控制状态时,您可以列举该Bucket中包含的所有文件(Object)、指定前缀的文件、指定目录下的文件和子目录等。

场景说明

假设您有一个名为examplebucket的存储空间,存储空间内的文件结构如下所示:

examplebucket
  └── fun
       └── exampleobject.jpg
       └── examplefile.txt
       └── destfolder
               └── image1.jpg
               └── image2.png
  └── srcfile.txt
  └── oss.jpg

以下示例分别说明如何通过对examplebucket设置不同的列举条件,获取不同的返回结果。

有关列举文件涉及的各个参数的更多信息,请参见GetBucketVersions(ListObjectVersions)

列举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/