本文介绍如何列举指定存储空间(Bucket)下的所有文件(Object)、指定前缀的文件、指定目录下的文件和子目录等。

注意事项

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见 访问域名和数据中心
  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见 Go初始化
  • 要列举文件,您必须有 oss:ListObjects 权限。具体操作,请参见 为RAM用户授权自定义的权限策略

背景信息

您可以调用GetBucket (ListObjects)或GetBucketV2 (ListObjectsV2)接口,一次性列举某个Bucket下最多1000个Object。您可以通过指定参数实现多种列举功能,例如通过指定参数列举指定起始位置后的所有文件、列举指定目录下的文件和子目录以及列举结果分页。这两个接口的主要区别如下:

  • 使用GetBucket (ListObjects)接口列举文件时,默认返回Owner信息。
  • 使用GetBucketV2 (ListObjectsV2)接口列举文件时,需通过fetchOwner指定是否在返回结果中包含Owner信息。
    说明 对于开启版本控制的Bucket,建议使用GetBucketV2 (ListObjectsV2)接口列举文件。

以下分别介绍通过GetBucket (ListObjects)以及GetBucketV2 (ListObjectsV2)方法列举文件时涉及的参数说明。

  • 通过GetBucket (ListObjects)方法列举文件

    GetBucket (ListObjects)涉及参数说明如下:

    参数 说明
    delimiter 对文件名称进行分组的一个字符。所有名称包含指定的前缀且第一次出现delimiter字符之间的文件作为一组元素(commonPrefixes)。
    prefix 限定返回的文件必须以prefix作为前缀。
    maxKeys 限定此次列举文件的最大个数。默认值为100,最大值为1000。
    marker 此次列举文件的起点。

    更多信息,请参见 ListObjects(GetBucket)

  • 通过GetBucketV2 (ListObjectsV2)方法列举文件

    GetBucketV2 (ListObjectsV2)涉及参数说明如下:

    参数 描述
    prefix 限定返回的文件必须以prefix作为前缀。
    delimiter 对文件名称进行分组的一个字符。所有名称包含指定的前缀且第一次出现delimiter字符之间的文件作为一组元素(commonPrefixes)。
    startAfter 此次列举文件的起点。
    fetchOwner 指定是否在返回结果中包含Owner信息。
    • true:表示返回结果中包含Owner信息。
    • false:表示返回结果中不包含Owner信息。

    更多信息,请参见 ListObjectsV2(GetBucketV2)

简单列举文件

  • 通过GetBucket (ListObjects)方法列举

    通过GetBucket (ListObjects)方法列举指定Bucket下的100个文件的示例代码如下:

    package main
    import (
        "fmt"
        "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        if err != nil {
            HandleError(err)
        // 填写存储空间名称。
        bucketName := "yourBucketName"
        bucket, err := client.Bucket(bucketName)
        if err != nil {
            HandleError(err)
        // 列举所有文件。
        marker := ""
        for {
            lsRes, err := bucket.ListObjects(oss.Marker(marker))
            if err != nil {
                HandleError(err)
            // 打印列举结果。默认情况下,一次返回100条记录。
            for _, object := range lsRes.Objects {
                fmt.Println("Bucket: ", object.Key)
            if lsRes.IsTruncated {
                marker = lsRes.NextMarker
            } else {
                break
    }
  • 通过GetBucketV2 (ListObjectsV2)方法列举

    通过GetBucketV2 (ListObjectsV2)方法列举指定Bucket下的100个文件的示例代码如下:

    package main
    import (
        "fmt"
        "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        if err != nil {
             HandleError(err)
        // 填写存储空间名称。
        bucketName := "yourBucketName"
        bucket, err := client.Bucket(bucketName)
        if err != nil {
             HandleError(err)
        continueToken := ""
        for {
             lsRes, err := bucket.ListObjectsV2(oss.ContinuationToken(continueToken))
             if err != nil {
                 HandleError(err)
              // 打印列举结果。默认情况下,一次返回100条记录。
              for _, object := range lsRes.Objects {
                  fmt.Println(object.Key, object.Type, object.Size, object.ETag, object.LastModified, object.StorageClass)
              if lsRes.IsTruncated {
                  continueToken = lsRes.NextContinuationToken
              } else {
                  break
    }

列举指定个数的文件

  • 通过GetBucket (ListObjects)方法列举

    通过GetBucket (ListObjects)方法列举指定个数文件的示例代码如下:

    package main
    import (
        "fmt"
        "github.com/aliyun/aliyun-oss-go-sdk/oss"
    func main() {
        // 创建OSSClient实例。
        // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
         // 填写存储空间名称。
         bucketName := "yourBucketName"
         bucket, err := client.Bucket(bucketName)
         if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
          // 设置列举文件的最大个数,并列举文件。
          lsRes, err := bucket.ListObjects(oss.MaxKeys(200))
          if err != nil {
              fmt.Println("Error:", err)
              os.Exit(-1)
          // 打印列举结果。默认情况下,一次返回100条记录。
          fmt.Println("Objects:", lsRes.Objects)
          for _, object := range lsRes.Objects {
              fmt.Println("Object:", object.Key)
     }
  • 通过GetBucketV2 (ListObjectsV2)方法列举

    通过GetBucketV2 (ListObjectsV2)方法列举指定个数文件的示例代码如下:

    package main
    import (
         "fmt"
         "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
         // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
         client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
         if err != nil {
             HandleError(err)
         // 填写存储空间名称。
         bucketName := "yourBucketName"
         bucket, err := client.Bucket(bucketName)
         if err != nil {
             HandleError(err)
         // 通过MaxKeys设置文件列举的最大个数,并列举文件。
         lsRes, err := bucket.ListObjectsV2(oss.MaxKeys(200))
         if err != nil {
             HandleError(err)
         // 打印列举结果。默认情况下,一次返回100条记录。
         for _, object := range lsRes.Objects {
             fmt.Println(object.Key, object.Type, object.Size, object.ETag, object.LastModified, object.StorageClass, object.Owner.ID, object.Owner.DisplayName)
     }

列举指定前缀的文件

  • 通过GetBucket (ListObjects)方法列举

    通过GetBucket (ListObjects)方法列举指定前缀的文件的示例代码如下:

    package main
    import (
        "fmt"
        "github.com/aliyun/aliyun-oss-go-sdk/oss"
    func main() {
        // 创建OSSClient实例。
        // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        // 填写存储空间名称。
        bucketName := "yourBucketName"
        bucket, err := client.Bucket(bucketName)
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        // 列举包含指定前缀的文件。默认列举100个文件。
        lsRes, err := bucket.ListObjects(oss.Prefix("my-object-"))
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        // 打印列举结果。默认情况下,一次返回100条记录。
        fmt.Println("Objects:", lsRes.Objects)
        for _, object := range lsRes.Objects {
            fmt.Println("Object:", object.Key)
    }
  • 通过GetBucketV2 (ListObjectsV2)方法列举

    通过GetBucketV2 (ListObjectsV2)方法列举指定前缀的文件的示例代码如下:

    package main
    import (
        "fmt"
        "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        if err != nil {
            HandleError(err)
        // 填写存储空间名称。
        bucketName := "yourBucketName"
        bucket, err := client.Bucket(bucketName)
        if err != nil {
            HandleError(err)
        // 通过Prefix参数设置列举的文件前缀为my-object-。
        lsRes, err := bucket.ListObjectsV2(oss.Prefix("my-object-"))
        if err != nil {
            HandleError(err)
        // 打印列举结果。默认情况下,一次返回100条记录。
        for _, object := range lsRes.Objects {
            fmt.Println(object.Key, object.Type, object.Size, object.ETag, object.LastModified, object.StorageClass, object.Owner.ID, object.Owner.DisplayName)
    }

列举指定起始位置之后的文件

  • 通过GetBucket (ListObjects)方法列举

    通过设置Marker参数指定列举的起始位置,OSS将返回Marker字典序后的所有文件。

    package main
    import (
        "fmt"
        "github.com/aliyun/aliyun-oss-go-sdk/oss"
    func main() {
        // 创建OSSClient实例。
        // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        if err != nil {
             fmt.Println("Error:", err)
             os.Exit(-1)
         // 填写存储空间名称。
            bucketName := "yourBucketName"
        if err != nil {
             fmt.Println("Error:", err)
             os.Exit(-1)
        marker  := oss.Marker("")
        for {
             lsRes, err := bucket.ListObjects(marker)
             if err != nil {
                 fmt.Println("Error:", err)
                 os.Exit(-1)
              // 打印列举结果。默认情况下,一次返回100条记录。
             fmt.Println("Objects:", lsRes.Objects)
             for _, object := range lsRes.Objects {
                 fmt.Println("Object:", object.Key)
            if lsRes.IsTruncated {
                 marker = oss.Marker(lsRes.NextMarker)
            }else{
                break
    }
  • 通过GetBucketV2 (ListObjectsV2)方法列举

    通过设置StartAfter参数可以指定列举的起始位置,OSS将返回StartAfter字典序后的所有文件。

    package main
    import (
        "fmt"
        "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        if err != nil {
            HandleError(err)
        // 填写存储空间名称。
        bucketName := "yourBucketName"
        bucket, err := client.Bucket(bucketName)
        if err != nil {
            HandleError(err)
        // 指定列举StartAfter之后的文件。默认列举100个文件。
        lsRes, err := bucket.ListObjectsV2(oss.StartAfter("my-object-"))
        if err != nil {
            HandleError(err)
        // 打印列举结果。默认情况下,一次返回100条记录。
        for _, object := range lsRes.Objects {
            fmt.Println(object.Key, object.Type, object.Size, object.ETag, object.LastModified, object.StorageClass, object.Owner.ID, object.Owner.DisplayName)
    }

分页列举所有文件

  • 通过GetBucket (ListObjects)方法列举

    通过GetBucket (ListObjects)方法列举分页列举指定Bucket下的所有文件。每页列举的文件个数通过MaxKeys指定。

    package main
    import (
        "fmt"
        "github.com/aliyun/aliyun-oss-go-sdk/oss"
    func main() {
        // 创建OSSClient实例。
        // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
       // 填写存储空间名称。
        bucketName := "yourBucketName"
        bucket, err := client.Bucket(bucketName)
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        // 分页列举所有文件。每页列举100个。
        marker := oss.Marker("")
        for {
            lsRes, err := bucket.ListObjects(oss.MaxKeys(100), marker)
            if err != nil {
                fmt.Println("Error:", err)
                os.Exit(-1)
            // 打印列举结果。默认情况下,一次返回100条记录。
            fmt.Println("Objects:", lsRes.Objects)
            if lsRes.IsTruncated {
                marker = oss.Marker(lsRes.NextMarker)
            }else{
                break
    }
  • 通过GetBucketV2 (ListObjectsV2)方法列举

    通过GetBucketV2 (ListObjectsV2)方法列举分页列举指定Bucket下的所有文件。每页列举的文件个数通过MaxKeys指定。

    package main
    import (
        "fmt"
        "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        if err != nil {
            HandleError(err)
        // 填写存储空间名称。
        bucketName := "yourBucketName"
        bucket, err := client.Bucket(bucketName)
        if err != nil {
            HandleError(err)
        // 分页列举所有文件。每页列举100个。
        continueToken := ""
        for {
            lsRes, err := bucket.ListObjectsV2(oss.MaxKeys(100), oss.ContinuationToken(continueToken))
            if err != nil {
                HandleError(err)
            // 打印列举结果。默认情况下,一次返回100条记录。
            for _, object := range lsRes.Objects {
                fmt.Println(object.Key, object.Type, object.Size, object.ETag, object.LastModified, object.StorageClass)
            if lsRes.IsTruncated {
                continueToken = lsRes.NextContinuationToken
            } else {
                break
    }

分页列举指定前缀的文件

  • 通过GetBucket (ListObjects)方法列举

    通过GetBucket (ListObjects)方法分页列举指定前缀的文件。每页列举的文件个数通过MaxKeys指定。

    package main
    import (
        "fmt"
        "github.com/aliyun/aliyun-oss-go-sdk/oss"
    func main() {
        // 创建OSSClient实例。
        // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        // 填写存储空间名称。
        bucketName := "yourBucketName"
        bucket, err := client.Bucket(bucketName)
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        // 分页列举包含指定前缀的文件。每页列举80个。
        prefix := oss.Prefix("my-object-")
        marker := oss.Marker("")
        for {
            lsRes, err := bucket.ListObjects(oss.MaxKeys(80), marker, prefix)
            if err != nil {
                fmt.Println("Error:", err)
                os.Exit(-1)
            // 打印列举结果。默认情况下,一次返回100条记录。
            fmt.Println("Objects:", lsRes.Objects)
            if lsRes.IsTruncated {
                prefix = oss.Prefix(lsRes.Prefix)
                marker = oss.Marker(lsRes.NextMarker)
            }else{
                break
    }
  • 通过GetBucketV2 (ListObjectsV2)方法列举

    通过GetBucketV2 (ListObjectsV2)方法分页列举指定前缀的文件。每页列举的文件个数通过MaxKeys指定。

    package main
    import (
        "fmt"
        "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        if err != nil {
            HandleError(err)
        // 填写存储空间名称。
        bucketName := "yourBucketName"
        bucket, err := client.Bucket(bucketName)
        if err != nil {
            HandleError(err)
        // 分页列举指定前缀的文件。每页列举80个。
        prefix := oss.Prefix("my-object-")
        continueToken := ""
        for {
            lsRes, err := bucket.ListObjectsV2(prefix, oss.MaxKeys(80), oss.ContinuationToken(continueToken))
            if err != nil {
                HandleError(err)
            // 打印列举结果。默认情况下,一次返回100条记录。
            for _, object := range lsRes.Objects {
                fmt.Println(object.Key, object.Type, object.Size, object.ETag, object.LastModified, object.StorageClass)
            if lsRes.IsTruncated {
                continueToken = lsRes.NextContinuationToken
                prefix = oss.Prefix(lsRes.Prefix)
            } else {
                break
    }

列举指定目录下所有文件的信息

  • 通过GetBucket (ListObjects)方法列举

    通过GetBucket (ListObjects)方法列举指定前缀(目录)下所有文件的信息,包括文件大小、文件最后修改时间以及文件名等。

    package main
    import (
        "fmt"
        "github.com/aliyun/aliyun-oss-go-sdk/oss"
    func main() {
        // 创建OSSClient实例。
        // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        // 填写存储空间名称。
        bucketName := "yourBucketName"
        bucket, err := client.Bucket(bucketName)
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        // 遍历文件。
        marker := oss.Marker("")
        prefix := oss.Prefix("test")
        for {
            lor, err := bucket.ListObjects(marker, prefix)
            if err != nil {
               fmt.Println("Error:", err)
               os.Exit(-1)
            for _, object := range lor.Objects {
               fmt.Println(object.Key, object.Type, object.Size, object.ETag, object.LastModified, object.StorageClass)
          if lor.IsTruncated {
               prefix = oss.Prefix(lor.Prefix)
               marker = oss.Marker(lor.NextMarker)
          }else{
              break
    }
  • 通过GetBucketV2 (ListObjectsV2)方法列举

    通过GetBucketV2 (ListObjectsV2)方法列举指定前缀(目录)下所有文件的信息,包括文件大小、文件最后修改时间以及文件名等。

    package main
    import (
        "fmt"
        "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        if err != nil {
            HandleError(err)
        // 填写存储空间名称。
        bucketName := "yourBucketName"
        bucket, err := client.Bucket(bucketName)
        if err != nil {
            HandleError(err)
        continueToken := ""
        prefix := oss.Prefix("fun")
        for {
            lsRes, err := bucket.ListObjectsV2(prefix, oss.ContinuationToken(continueToken))
             if err != nil {
                HandleError(err)
            // 打印列举文件,默认情况下,一次返回100条记录。
            for _, object := range lsRes.Objects {
               fmt.Println(object.Key, object.Type, object.Size, object.ETag, object.LastModified, object.StorageClass)
            if lsRes.IsTruncated {
               continueToken = lsRes.NextContinuationToken
               prefix = oss.Prefix(lsRes.Prefix)
          } else {
             break
    }

列举指定目录下所有子目录的信息

  • 通过GetBucket (ListObjects)方法列举

    通过GetBucket (ListObjects)方法列举指定前缀(目录)下所有子目录信息的示例代码如下:

    package main
    import (
         "fmt"
         "github.com/aliyun/aliyun-oss-go-sdk/oss"
     func main() {
         // 创建OSSClient实例。
         // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
         // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
         client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
         if err != nil {
             fmt.Println("Error:", err)
             os.Exit(-1)
         // 填写存储空间名称。
         bucketName := "yourBucketName"
         bucket, err := client.Bucket(bucketName)
         if err != nil {
             fmt.Println("Error:", err)
             os.Exit(-1)
         marker := oss.Marker("")
         prefix := oss.Prefix("yourDirPrefix")
         for {
             lor, err := bucket.ListObjects(marker, prefix, oss.Delimiter("/"))
             if err != nil {
                 fmt.Println("Error:", err)
                 os.Exit(-1)
             for _, dirName := range lor.CommonPrefixes {
                 fmt.Println(dirName)
             if lor.IsTruncated {
                 prefix = oss.Prefix(lor.Prefix)
                 marker = oss.Marker(lor.NextMarker)
             }else{
                 break
     }
  • 通过GetBucketV2 (ListObjectsV2)方法列举

    通过GetBucketV2 (ListObjectsV2)方法列举指定前缀(目录)下所有子目录信息的示例代码如下:

    package main
    import (
        "fmt"
        "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
        if err != nil {
            HandleError(err)
        // 填写存储空间名称。
        bucketName := "yourBucketName"
        bucket, err := client.Bucket(bucketName)
        if err != nil {
            HandleError(err)
        continueToken := ""
        prefix := oss.Prefix("")
        for {
          lsRes, err := bucket.ListObjectsV2(prefix, oss.ContinuationToken(continueToken), oss.Delimiter("/"))
          if err != nil {
              HandleError(err)
          for _, dirName := range lsRes.CommonPrefixes {
              fmt.Println(dirName)
          if lsRes.IsTruncated {
              prefix = oss.Prefix(lsRes.Prefix)
              continueToken = lsRes.NextContinuationToken
          } else {
              break
    }

列举文件并返回Owner信息

通过GetBucketV2 (ListObjectsV2)方法列举文件并返回Owner信息示例代码如下:

package main
import (
    "fmt"
    "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
    if err != nil {
        HandleError(err)
    // 填写存储空间名称。
    bucketName := "yourBucketName"
    bucket, err := client.Bucket(bucketName)
    if err != nil {
        HandleError(err)
    // 获取Owner信息。
    lsRes, err := bucket.ListObjectsV2(oss.FetchOwner(true))
    if err != nil {
        HandleError(err)
    // 打印列举文件,默认情况下一次返回100条记录。
    for _, object := range lsRes.Objects {
        fmt.Println(object.Key, object.Owner.ID, object.Owner.DisplayName)
}

文件夹

OSS没有文件夹的概念,所有元素都是以文件来存储。创建文件夹本质上来说是创建了一个大小为0并以正斜线(/)结尾的文件。这个文件可以被上传和下载,控制台会对以正斜线(/)结尾的文件以文件夹的方式展示。关于创建文件夹的完整示例代码,请参见 GitHub示例

通过delimiter和prefix两个参数可以模拟文件夹功能:

  • 如果设置prefix为某个文件夹名称,则会列举以此prefix开头的文件,即该文件夹下所有的文件和子文件夹(目录)均显示为objects。
  • 如果在设置了prefix的情况下,将delimiter设置为正斜线(/),则只列举该文件夹下的文件和子文件夹(目录),该文件夹下的子文件夹(目录)显示为CommonPrefixes,子文件夹下的文件和文件夹不显示。

假设存储空间中包含文件 oss.jpg fun/test.jpg fun/movie/001.avi fun/movie/007.avi ,以正斜线(/)作为文件夹的分隔符。以下示例说明了如何通过模拟文件夹的方式列举文件。

  • 列举存储空间下的所有文件
    • 通过GetBucket (ListObjects)方法列举存储空间下的所有文件的示例代码如下:
      package main
      import (
          "fmt"
          "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
          // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
          client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
          if err != nil {
              HandleError(err)
              os.Exit(-1)
          // 填写存储空间名称。
          bucketName := "yourBucketName"
          bucket,err := client.Bucket(bucketName)
          if err != nil {
              HandleError(err)
              os.Exit(-1)
          // 列举指定存储空间下所有文件。
          marker := oss.Marker("")
          for {
              lsRes, err := bucket.ListObjects(marker)
              if err != nil {
                  HandleError(err)
                  os.Exit(-1)
              for _,object := range lsRes.Objects{
                  fmt.Println("Bucket",object.Key)
              if lsRes.IsTruncated {
                  marker = oss.Marker(lsRes.NextMarker)
              }else{
                  break
      }
    • 通过GetBucketV2 (ListObjectsV2)列举指定存储空间下所有文件的示例代码如下:
      package main
      import (
          "fmt"
          "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
          // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
          client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
          if err != nil {
              HandleError(err)
              os.Exit(-1)
          // 填写存储空间名称。
          bucketName := "yourBucketName"
          bucket,err := client.Bucket(bucketName)
          if err != nil {
              HandleError(err)
              os.Exit(-1)
          // 列举指定存储空间下所有文件。
          startAfter := ""
          continueToken := ""
          for {
              lsRes, err := bucket.ListObjectsV2(oss.StartAfter(startAfter),oss.ContinuationToken(continueToken))
              if err != nil {
                  HandleError(err)
                  os.Exit(-1)
              for _,object := range lsRes.Objects{
                  fmt.Println("Bucket",object.Key)
              if lsRes.IsTruncated {
                  startAfter = lsRes.StartAfter
                  continueToken = lsRes.NextContinuationToken
             }else{
                  break
      }
    • 通过以上两种方法列举指定存储空间下所有文件的返回结果如下。
      Objects:
      fun/movie/001.avi
      fun/movie/007.avi
      fun/test.jpg
      oss.jpg
      CommonPrefixes:  
  • 列举指定目录下所有文件
    • 通过GetBucket (ListObjects)方法列举指定目录下的所有文件的示例代码如下:
      package main
      import (
          "fmt"
          "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
          // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
          client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
          if err != nil {
              fmt.Println("Error:", err)
              os.Exit(-1)
          // 填写存储空间名称。
          bucket, err := client.Bucket("yourBucketName")
          if err != nil {
              HandleError(err)
              os.Exit(-1)
          // 列举指定目录下的所有文件。
          prefix := oss.Prefix("aaa/db-init")
          marker := oss.Marker("")
          for {
              lsRes, err := bucket.ListObjects(prefix,marker)
              if err != nil {
                  HandleError(err)
                  os.Exit(-1)
              for _,object := range lsRes.Objects{
                  fmt.Println("Bucket",object.Key)
              if lsRes.IsTruncated {
                  prefix = oss.Prefix(lsRes.Prefix)
                  marker = oss.Marker(lsRes.NextMarker)
              }else{
                  break
      }
    • 通过GetBucketV2 (ListObjectsV2)方法列举指定目录下的所有文件的示例代码如下:
      package main
      import (
          "fmt"
          "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
          // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
          client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
          if err != nil {
              fmt.Println("Error:", err)
              os.Exit(-1)
          // 填写存储空间名称。
          bucket, err := client.Bucket("yourBucketName")
          if err != nil {
              HandleError(err)
              os.Exit(-1)
          // 列举指定目录下的所有文件。
          prefix := oss.Prefix("aaa/db-init")
          continueToken := ""
          for {
              lsRes, err := bucket.ListObjectsV2(prefix,oss.ContinuationToken(continueToken))
              if err != nil {
                 HandleError(err)
                 os.Exit(-1)
              for _,object := range lsRes.Objects{
                 fmt.Println("Bucket",object.Key)
              if lsRes.IsTruncated {
                 prefix = oss.Prefix(lsRes.Prefix)
                 continueToken = lsRes.NextContinuationToken
              }else{
                 break
      }
    • 通过以上两种方法列举指定目录下所有文件的返回结果如下。
      Objects:
      fun/movie/001.avi
      fun/movie/007.avi
      fun/test.jpg
      CommonPrefixes: 
  • 列举目录下的文件和子目录
    • 通过GetBucket (ListObjects)方法列举目录下的文件和子目录的示例如下:
      package main
      import (
          "fmt"
          "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
          // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
          client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
          if err != nil {
              fmt.Println("Error:", err)
              os.Exit(-1)
          // 填写存储空间名称。
          bucket, err := client.Bucket("yourBucketName")
          if err != nil {
              HandleError(err)
              os.Exit(-1)
          // 列举指定目录下的文件和子目录。
          prefix := oss.Prefix("aaa/db-init/")
          marker := oss.Marker("")
          delimiter := "/"
          for {
          lsRes, err := bucket.ListObjects(prefix,marker,oss.Delimiter(delimiter))
          if err != nil {
              HandleError(err)
              os.Exit(-1)
          for _,object := range lsRes.Objects{
              fmt.Println("Objects",object.Key)
          for _,object := range lsRes.CommonPrefixes{
              fmt.Println("CommonPrefixes",object)
          if lsRes.IsTruncated {
              prefix = oss.Prefix(lsRes.Prefix)
              marker = oss.Marker(lsRes.NextMarker)
          }else{
             break
      }
    • 通过GetBucketV2 (ListObjectsV2)方法列举目录下的文件和子目录的示例代码如下:
      package main
      import (
          "fmt"
          "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
          // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
          client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
          if err != nil {
              fmt.Println("Error:", err)
              os.Exit(-1)
          // 填写存储空间名称。
          bucket, err := client.Bucket("yourBucketName")
          if err != nil {
              HandleError(err)
              os.Exit(-1)
          // 列举指定目录下的文件和子目录。
          prefix := oss.Prefix("")
          continueToken := ""
          delimiter := "/"
          for {
              lsRes, err := bucket.ListObjectsV2(prefix,oss.Delimiter(delimiter),oss.ContinuationToken(continueToken))
              if err != nil {
                 HandleError(err)
                 os.Exit(-1)
              for _,object := range lsRes.Objects{
                 fmt.Println("Objects",object.Key)
              for _,object := range lsRes.CommonPrefixes{
                 fmt.Println("CommonPrefixes",object)
              if lsRes.IsTruncated {
                 prefix = oss.Prefix(lsRes.Prefix)
                 continueToken = lsRes.NextContinuationToken
              }else{
                 break
      }
    • 通过以上两种方法列举指定目录下的文件和子目录的返回结果如下:
      Objects:
      fun/test.jpg
      CommonPrefixes:
      fun/movie/   
  • 获取指定目录下的文件大小
    • 通过GetBucket (ListObjects)方法获取指定目录下的文件大小的示例代码如下:
      package main
      import (
          "fmt"
          "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
          // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
          client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
          if err != nil {
              fmt.Println("Error:", err)
              os.Exit(-1)
          // 填写存储空间名称。
          bucket, err := client.Bucket("yourBucketName")
          if err != nil {
              HandleError(err)
              os.Exit(-1)
          // 获取指定目录下的文件大小。
          prefix := "test/"
          marker := ""
          for {
              lsRes, err := bucket.ListObjects(oss.Prefix(prefix),oss.Marker(marker))
              if err != nil {
                 HandleError(err)
                 os.Exit(-1)
              for _,object := range lsRes.Objects{
                 fmt.Println("Objects",object.Key, "length",object.Size ,"Byte.")
              if lsRes.IsTruncated {
                 marker = lsRes.NextMarker
                 prefix = lsRes.Prefix
              }else{
                 break
      }
    • 通过GetBucketV2 (ListObjectsV2)方法获取指定目录下的文件大小的示例代码如下:
      package main
      import (
          "fmt"
          "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(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
          // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
          client, err := oss.New("yourEndpoint","yourAccessKeyId","yourAccessKeySecret")
          if err != nil {
           fmt.Println("Error:", err)
           os.Exit(-1)
          // 获取存储空间。
          bucket, err := client.Bucket("yourBucketName")
          if err != nil {
           HandleError(err)
           os.Exit(-1)
          // 获取指定目录下的文件大小。
          prefix := oss.Prefix("/fun")
          continueToken := ""
          for {
          lsRes, err := bucket.ListObjectsV2(prefix,oss.ContinuationToken(continueToken))
          if err != nil {
               HandleError(err)
               os.Exit(-1)
          for _,object := range lsRes.Objects{
               fmt.Println("Objects",object.Key, "length",object.Size ,"Byte.")
          if lsRes.IsTruncated {
                prefix = oss.Prefix(lsRes.Prefix)
                continueToken = lsRes.NextContinuationToken
          } else {
                break
      }

常见问题

列举文件时是否支持按文件最后一次修改时间进行排序?

不支持。如果您需要按照文件最后一次修改时间进行排序,建议使用数据索引功能。更多信息,请参见 数据索引

相关文档