Go列举文件

本文介绍如何使用OSS Go SDK列举指定存储空间(Bucket)下的所有文件。

注意事项

  • 本文示例代码以华东1(杭州)的地域IDcn-hangzhou为例,默认使用外网Endpoint,如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的RegionEndpoint的对应关系,请参见OSS地域和访问域名

  • 本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证

  • 要列举文件,您必须有oss:ListObjects权限。具体操作,请参见RAM用户授权自定义的权限策略

方法定义

高级版列举文件API

重要
  • 对常用的列举接口,Go SDK V2最新版提供了分页器(Paginator)支持自动分页,当进行多次调用时,自动为您获取下一页结果。使用分页器时,您只需要编写处理结果的代码。

  • 分页器包含了分页器对象<OperationName>Paginator和分页器创建方法New<OperationName>Paginator。分页器创建方法返回一个分页器对象,该对象实现了HasNextNextPage方法,分别用于判断是否还有更多页,并调用操作来获取下一页。

列举文件的接口定义如下:

type ListObjectsV2Paginator struct

func (p *ListObjectsV2Paginator) HasNext() bool

func (p *ListObjectsV2Paginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListObjectsV2Result, error)

func (c *Client) NewListObjectsV2Paginator(request *ListObjectsV2Request, optFns ...func(*PaginatorOptions)) *ListObjectsV2Paginator

请求参数列表

参数名

类型

说明

request

*ListObjectsV2Request

设置具体接口的请求参数,

具体请参见ListObjectsV2Request

optFns

...func(*PaginatorOptions)

(可选)接口级的配置参数, 请参见PaginatorOptions

其中,ListObjectsV2Request的常用参数列举如下:

参数

描述

prefix

限定返回的文件必须以prefix作为前缀

maxKeys

限定每次最多返回的文件数量

delimiter

对文件名称进行分组的一个字符,所有名称包含指定的前缀且第一次出现delimiter字符之间的文件作为一组元素(commonPrefixes)

startAfter

此次列举文件的起点

fetchOwner

指定是否在返回结果中包含Owner信息

  • true:表示返回结果中包含Owner信息

  • false:表示返回结果中不包含Owner信息

返回值列表

返回值

说明

*ListObjectsV2Paginator

分页器对象,该对象实现了HasNextNextPage方法,分别用于判断是否还有更多页, 并调用操作来获取下一页

基础版列举文件API

func (c *Client) ListObjectsV2(ctx context.Context, request *ListObjectsV2Request, optFns ...func(*Options)) (*ListObjectsV2Result, error)

请求参数列表

参数名

类型

说明

ctx

context.Context

请求的上下文,可以用来设置请求的总时限

request

*ListObjectsV2Request

设置具体接口的请求参数,具体请参见ListObjectsV2Request

optFns

...func(*Options)

(可选)接口级的配置参数, 具体请参见Options

返回值列表

返回值名

类型

说明

result

*ListObjectsV2Result

接口返回值,当 err 为nil 时有效,具体请参见ListObjectsV2Result

err

error

请求的状态,当请求失败时,err 不为 nil

示例代码

使用高级版API列举文件

您可以通过以下示例代码,使用分页器列举指定Bucket下的所有文件。

package main

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// 定义全局变量
var (
	region     string // 存储区域
	bucketName string // 存储空间名称
)

// init函数用于初始化命令行参数
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The `name` of the bucket.")
}

func main() {
	// 解析命令行参数
	flag.Parse()

	// 检查bucket名称是否为空
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// 创建OSS客户端
	client := oss.NewClient(cfg)

	// 创建列出对象的请求
	request := &oss.ListObjectsV2Request{
		Bucket: oss.Ptr(bucketName),
	}

	// 创建分页器
	p := client.NewListObjectsV2Paginator(request)

	// 初始化页码计数器
	var i int
	log.Println("Objects:")

	// 遍历分页器中的每一页
	for p.HasNext() {
		i++

		// 获取下一页的数据
		page, err := p.NextPage(context.TODO())
		if err != nil {
			log.Fatalf("failed to get page %v, %v", i, err)
		}

		// 打印该页中的每个对象的信息
		for _, obj := range page.Contents {
			log.Printf("Object:%v, %v, %v\n", oss.ToString(obj.Key), obj.Size, oss.ToTime(obj.LastModified))
		}
	}
}

使用基础版API列举文件

您可以通过以下示例代码,使用ListObjectsV2接口列举指定Bucket下的所有文件。

package main

import (
	"context"
	"flag"
	"log"
	"time"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// 定义全局变量
var (
	region     string // 存储区域
	bucketName string // 存储桶名称
)

// init 函数用于初始化命令行参数
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The `name` of the bucket.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查bucket名称是否为空
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// 创建 OSS 客户端
	client := oss.NewClient(cfg)

	var continueToken string = ""

	// 创建 ListObjectsV2 请求
	request := &oss.ListObjectsV2Request{
		Bucket:            oss.Ptr(bucketName),
		ContinuationToken: &continueToken,
		MaxKeys:           10,
	}

	for {
		// 执行列举所有文件的操作
		lsRes, err := client.ListObjectsV2(context.TODO(), request)
		if err != nil {
			log.Fatalf("Failed to list objects: %v", err)
		}

		// 打印列举结果
		for _, object := range lsRes.Contents {
			log.Printf("Object Key: %s, Type: %s, Size: %d, ETag: %s, LastModified: %s, StorageClass: %s\n",
				*object.Key, *object.Type, object.Size, *object.ETag, object.LastModified.Format(time.RFC3339), *object.StorageClass)
		}

		// 如果还有更多对象需要列举,则更新continueToken标记并继续循环
		if lsRes.IsTruncated {
			continueToken = *lsRes.NextContinuationToken
		} else {
			break // 如果没有更多对象,退出循环
		}
	}

	log.Println("All objects have been listed.")
}

常见使用场景

列举指定目录下所有文件

使用分页器Paginator

以下示例代码通过设置Prefix参数,列举指定目录下所有文件的信息,包括文件大小、文件最后修改时间以及文件名等。

package main

import (
	"context"
	"flag"
	"fmt"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// 定义全局变量
var (
	region     string // 存储区域
	bucketName string // 存储空间名称
)

// init函数用于初始化命令行参数
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The `name` of the bucket.")
}

func main() {
	// 解析命令行参数
	flag.Parse()

	// 检查bucket名称是否为空
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// 创建OSS客户端
	client := oss.NewClient(cfg)

	// 创建列出对象的请求
	request := &oss.ListObjectsV2Request{
		Bucket:  oss.Ptr(bucketName),
		Prefix:  oss.Ptr("exampledir/"), // 列举指定目录下的所有对象
	}

	// 创建分页器
	p := client.NewListObjectsV2Paginator(request)

	// 初始化页码计数器
	var i int
	log.Println("Objects:")

	// 遍历分页器中的每一页
	for p.HasNext() {
		i++

		fmt.Printf("Page %v\n", i)

		// 获取下一页的数据
		page, err := p.NextPage(context.TODO())
		if err != nil {
			log.Fatalf("failed to get page %v, %v", i, err)
		}

		//打印continue token
		log.Printf("ContinuationToken:%v\n", oss.ToString(page.ContinuationToken))
		// 打印该页中的每个对象的信息
		for _, obj := range page.Contents {
			log.Printf("Object:%v, %v, %v\n", oss.ToString(obj.Key), obj.Size, oss.ToTime(obj.LastModified))
		}
	}
}

使用ListObjectsV2

以下示例代码通过设置Prefix参数,列举指定目录下所有文件的信息,包括文件大小、文件最后修改时间以及文件名等。

package main

import (
	"context"
	"flag"
	"log"
	"time"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// 定义全局变量
var (
	region     string // 存储区域
	bucketName string // 存储桶名称
)

// init 函数用于初始化命令行参数
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The `name` of the bucket.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查bucket名称是否为空
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// 创建 OSS 客户端
	client := oss.NewClient(cfg)

	var continueToken string = ""

	// 创建 ListObjectsV2 请求
	request := &oss.ListObjectsV2Request{
		Bucket:            oss.Ptr(bucketName),
		ContinuationToken: &continueToken,
		Prefix:            oss.Ptr("exampledir/"), // 列举指定目录下的所有对象
	}

	for {
		lsRes, err := client.ListObjectsV2(context.TODO(), request)
		if err != nil {
			log.Fatalf("Failed to list objects: %v", err)
		}

		// 打印列举结果
		for _, object := range lsRes.Contents {
			log.Printf("Object Key: %s, Type: %s, Size: %d, ETag: %s, LastModified: %s, StorageClass: %s\n",
				*object.Key, *object.Type, object.Size, *object.ETag, object.LastModified.Format(time.RFC3339), *object.StorageClass)
		}

		// 如果还有更多对象需要列举,则更新continueToken标记并继续循环
		if lsRes.IsTruncated {
			continueToken = *lsRes.NextContinuationToken
		} else {
			break // 如果没有更多对象,退出循环
		}
	}

	log.Println("All objects have been listed.")
}

列举指定前缀的文件

使用分页器Paginator

以下示例代码通过设置Prefix参数,列举指定前缀的文件信息,包括文件大小、文件最后修改时间以及文件名等。

package main

import (
	"context"
	"flag"
	"fmt"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// 定义全局变量
var (
	region     string // 存储区域
	bucketName string // 存储空间名称
)

// init函数用于初始化命令行参数
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The `name` of the bucket.")
}

func main() {
	// 解析命令行参数
	flag.Parse()

	// 检查bucket名称是否为空
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// 创建OSS客户端
	client := oss.NewClient(cfg)

	// 创建列出对象的请求
	request := &oss.ListObjectsV2Request{
		Bucket: oss.Ptr(bucketName),
		Prefix: oss.Ptr("my-object-"), // 列举指定前缀的所有对象
	}

	// 创建分页器
	p := client.NewListObjectsV2Paginator(request)

	// 初始化页码计数器
	var i int
	log.Println("Objects:")

	// 遍历分页器中的每一页
	for p.HasNext() {
		i++

		fmt.Printf("Page %v\n", i)

		// 获取下一页的数据
		page, err := p.NextPage(context.TODO())
		if err != nil {
			log.Fatalf("failed to get page %v, %v", i, err)
		}

		//打印continue token
		log.Printf("ContinuationToken:%v\n", oss.ToString(page.ContinuationToken))
		// 打印该页中的每个对象的信息
		for _, obj := range page.Contents {
			log.Printf("Object:%v, %v, %v\n", oss.ToString(obj.Key), obj.Size, oss.ToTime(obj.LastModified))
		}
	}
}

使用ListObjectsV2

以下示例代码通过设置Prefix参数,列举指定前缀的文件信息,包括文件大小、文件最后修改时间以及文件名等。

package main

import (
	"context"
	"flag"
	"log"
	"time"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// 定义全局变量
var (
	region     string // 存储区域
	bucketName string // 存储桶名称
)

// init 函数用于初始化命令行参数
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The `name` of the bucket.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查bucket名称是否为空
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// 创建 OSS 客户端
	client := oss.NewClient(cfg)

	var continueToken string = ""

	// 创建 ListObjectsV2 请求
	request := &oss.ListObjectsV2Request{
		Bucket:            oss.Ptr(bucketName),
		ContinuationToken: &continueToken,
		Prefix:            oss.Ptr("my-object-"),
	}

	for {
		lsRes, err := client.ListObjectsV2(context.TODO(), request)
		if err != nil {
			log.Fatalf("Failed to list objects: %v", err)
		}

		// 打印列举结果
		for _, object := range lsRes.Contents {
			log.Printf("Object Key: %s, Type: %s, Size: %d, ETag: %s, LastModified: %s, StorageClass: %s\n",
				*object.Key, *object.Type, object.Size, *object.ETag, object.LastModified.Format(time.RFC3339), *object.StorageClass)
		}

		// 如果还有更多对象需要列举,则更新continueToken标记并继续循环
		if lsRes.IsTruncated {
			continueToken = *lsRes.NextContinuationToken
		} else {
			break // 如果没有更多对象,退出循环
		}
	}

	log.Println("All objects have been listed.")
}

列举指定个数的文件

使用分页器Paginator

以下示例代码通过设置MaxKeys参数,列举指定个数的文件的信息,包括文件大小、文件最后修改时间以及文件名等。

package main

import (
	"context"
	"flag"
	"fmt"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// 定义全局变量
var (
	region     string // 存储区域
	bucketName string // 存储空间名称
)

// init函数用于初始化命令行参数
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The `name` of the bucket.")
}

func main() {
	// 解析命令行参数
	flag.Parse()

	// 检查bucket名称是否为空
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// 创建OSS客户端
	client := oss.NewClient(cfg)

	// 创建列出对象的请求
	request := &oss.ListObjectsV2Request{
		Bucket:  oss.Ptr(bucketName),
		MaxKeys: 10, //每次列举返回的最大对象数量
	}

	// 创建分页器
	p := client.NewListObjectsV2Paginator(request)

	// 初始化页码计数器
	var i int
	log.Println("Objects:")

	// 遍历分页器中的每一页
	for p.HasNext() {
		i++

		fmt.Printf("Page %v\n", i)

		// 获取下一页的数据
		page, err := p.NextPage(context.TODO())
		if err != nil {
			log.Fatalf("failed to get page %v, %v", i, err)
		}

		//打印continue token
		log.Printf("ContinuationToken:%v\n", oss.ToString(page.ContinuationToken))
		// 打印该页中的每个对象的信息
		for _, obj := range page.Contents {
			log.Printf("Object:%v, %v, %v\n", oss.ToString(obj.Key), obj.Size, oss.ToTime(obj.LastModified))
		}
	}
}

使用ListObjectsV2

以下示例代码通过设置MaxKeys参数,列举指定个数的文件的信息,包括文件大小、文件最后修改时间以及文件名等。

package main

import (
	"context"
	"flag"
	"log"
	"time"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// 定义全局变量
var (
	region     string // 存储区域
	bucketName string // 存储桶名称
)

// init 函数用于初始化命令行参数
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The `name` of the bucket.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查bucket名称是否为空
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// 创建 OSS 客户端
	client := oss.NewClient(cfg)

	var continueToken string = ""

	// 创建 ListObjectsV2 请求
	request := &oss.ListObjectsV2Request{
		Bucket:            oss.Ptr(bucketName),
		ContinuationToken: &continueToken,
		MaxKeys:           10, // 每次列举返回的最大对象数量
	}

	for {
		lsRes, err := client.ListObjectsV2(context.TODO(), request)
		if err != nil {
			log.Fatalf("Failed to list objects: %v", err)
		}

		// 打印列举结果
		for _, object := range lsRes.Contents {
			log.Printf("Object Key: %s, Type: %s, Size: %d, ETag: %s, LastModified: %s, StorageClass: %s\n",
				*object.Key, *object.Type, object.Size, *object.ETag, object.LastModified.Format(time.RFC3339), *object.StorageClass)
		}

		// 如果还有更多对象需要列举,则更新continueToken标记并继续循环
		if lsRes.IsTruncated {
			continueToken = *lsRes.NextContinuationToken
		} else {
			break // 如果没有更多对象,退出循环
		}
	}

	log.Println("All objects have been listed.")
}

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

使用分页器Paginator

以下示例代码通过设置StartAfter参数,指定列举的起始位置,返回StartAfter字典序后的所有文件。

package main

import (
	"context"
	"flag"
	"fmt"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// 定义全局变量
var (
	region     string // 存储区域
	bucketName string // 存储空间名称
)

// init函数用于初始化命令行参数
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The `name` of the bucket.")
}

func main() {
	// 解析命令行参数
	flag.Parse()

	// 检查bucket名称是否为空
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// 创建OSS客户端
	client := oss.NewClient(cfg)

	// 创建列出对象的请求
	request := &oss.ListObjectsV2Request{
		Bucket:     oss.Ptr(bucketName),
		StartAfter: oss.Ptr("my-object"), // 指定列举对象的起始位置
	}

	// 创建分页器
	p := client.NewListObjectsV2Paginator(request)

	// 初始化页码计数器
	var i int
	log.Println("Objects:")

	// 遍历分页器中的每一页
	for p.HasNext() {
		i++

		fmt.Printf("Page %v\n", i)

		// 获取下一页的数据
		page, err := p.NextPage(context.TODO())
		if err != nil {
			log.Fatalf("failed to get page %v, %v", i, err)
		}

		//打印continue token
		log.Printf("ContinuationToken:%v\n", oss.ToString(page.ContinuationToken))
		// 打印该页中的每个对象的信息
		for _, obj := range page.Contents {
			log.Printf("Object:%v, %v, %v\n", oss.ToString(obj.Key), obj.Size, oss.ToTime(obj.LastModified))
		}
	}
}

使用ListObjectsV2

以下示例代码通过设置StartAfter参数,指定列举的起始位置,返回StartAfter字典序后的所有文件。

package main

import (
	"context"
	"flag"
	"log"
	"time"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// 定义全局变量
var (
	region     string // 存储区域
	bucketName string // 存储桶名称
)

// init 函数用于初始化命令行参数
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The `name` of the bucket.")
}

func main() {
	flag.Parse() // 解析命令行参数

	// 检查bucket名称是否为空
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// 创建 OSS 客户端
	client := oss.NewClient(cfg)

	var continueToken string = ""

	// 创建 ListObjectsV2 请求
	request := &oss.ListObjectsV2Request{
		Bucket:            oss.Ptr(bucketName),
		ContinuationToken: &continueToken,
		StartAfter:        oss.Ptr("my-object"), // 指定列举对象的起始位置
	}

	for {
		lsRes, err := client.ListObjectsV2(context.TODO(), request)
		if err != nil {
			log.Fatalf("Failed to list objects: %v", err)
		}

		// 打印列举结果
		for _, object := range lsRes.Contents {
			log.Printf("Object Key: %s, Type: %s, Size: %d, ETag: %s, LastModified: %s, StorageClass: %s\n",
				*object.Key, *object.Type, object.Size, *object.ETag, object.LastModified.Format(time.RFC3339), *object.StorageClass)
		}

		// 如果还有更多对象需要列举,则更新continueToken标记并继续循环
		if lsRes.IsTruncated {
			continueToken = *lsRes.NextContinuationToken
		} else {
			break // 如果没有更多对象,退出循环
		}
	}

	log.Println("All objects have been listed.")
}

相关文档