本文介绍如何列举指定存储空间(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)方法列举存储空间下的所有文件的示例代码如下:
-
列举指定目录下所有文件
-
通过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)方法列举指定目录下的所有文件的示例代码如下:
-
列举目录下的文件和子目录
-
通过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)方法列举目录下的文件和子目录的示例如下:
-
获取指定目录下的文件大小
-
通过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 }
-
通过GetBucket (ListObjects)方法获取指定目录下的文件大小的示例代码如下:
常见问题
列举文件时是否支持按文件最后一次修改时间进行排序?
不支持。如果您需要按照文件最后一次修改时间进行排序,建议使用数据索引功能。更多信息,请参见 数据索引 。
相关文档
- 关于列举文件的完整示例代码,请参见 GitHub示例 。
- 关于列举文件的API接口说明,请参见 ListObjects(GetBucket) 和 ListObjectsV2(GetBucketV2) 。