本文介绍如何列举当前账号所有地域下符合指定条件的存储空间。
注意事项
本文示例代码以华东1(杭州)的地域ID
cn-hangzhou
为例,默认使用外网Endpoint,如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见OSS地域和访问域名。本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证。
要列举存储空间,您必须具有
oss:ListBuckets
权限。具体操作,请参见为RAM用户授权自定义的权限策略。
方法定义
高级版列举存储空间API
对常用的列举接口,Go SDK V2最新提供了分页器(Paginator)支持自动分页,当进行多次调用时,自动为您获取下一页结果。使用分页器时,您只需要编写处理结果的代码。
分页器包含了分页器对象<OperationName>Paginator和分页器创建方法New<OperationName>Paginator。分页器创建方法返回一个分页器对象,该对象实现了HasNext和NextPage方法,分别用于判断是否还有更多页,并调用操作来获取下一页。
列举存储空间的接口定义如下:
type ListBucketsPaginator struct
func (c *Client) NewListBucketsPaginator(request *ListBucketsRequest, optFns ...func(*PaginatorOptions)) *ListBucketsPaginator
func (p *ListBucketsPaginator) HasNext() bool
func (p *ListBucketsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*<OperationName>Result, error)
请求参数列表
参数名 | 类型 | 说明 |
request | *ListBucketsRequest | 设置接口的请求参数,具体请参见ListBucketsRequest |
optFns | ...func(*PaginatorOptions) | (可选)接口级的配置参数, 请参见PaginatorOptions |
返回值列表
返回值 | 说明 |
*ListBucketsPaginator | 分页器对象,该对象实现了HasNext和NextPage方法,分别用于判断是否还有更多页, 并调用操作来获取下一页 |
基础版列举存储空间API
func (c *Client) ListBuckets(ctx context.Context, request *ListBucketsRequest, optFns ...func(*Options)) (*ListBucketsResult, error)
请求参数列表
参数名 | 类型 | 说明 |
ctx | context.Context | 请求的上下文,可以用来设置请求的总时限 |
request | *ListBucketsRequest | 设置具体接口的请求参数,具体请参见ListBucketsRequest |
optFns | ...func(*Options) | (可选)接口级的配置参数, 具体请参见Options |
返回值列表
返回值名 | 类型 | 说明 |
result | *ListBucketsResult | 接口返回值,当 err 为nil 时有效,具体请参见ListBucketsResult |
err | error | 请求的状态,当请求失败时,err 不为 nil |
示例代码
使用高级版API列举存储空间
您可以使用以下代码列举当前账号所有地域下的存储空间。
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 // 存储区域
)
// init函数用于初始化命令行参数
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
// 解析命令行参数
flag.Parse()
// 检查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.ListBucketsRequest{}
// 定义一个函数来处理 PaginatorOptions
modifyOptions := func(opts *oss.PaginatorOptions) {
// 在这里可以修改opts的值,比如设置每页返回的存储空间数量上限
// 示例:opts.Limit = 5,即每页返回5个存储空间
opts.Limit = 5
}
// 创建分页器
p := client.NewListBucketsPaginator(request, modifyOptions)
var i int
log.Println("Buckets:")
// 遍历分页器中的每一页
for p.HasNext() {
i++
// 获取下一页的数据
page, err := p.NextPage(context.TODO())
if err != nil {
log.Fatalf("failed to get page %v, %v", i, err)
}
// 打印该页中的每个存储空间的信息
for _, b := range page.Buckets {
log.Printf("Bucket: %v, StorageClass: %v, Location: %v\n", oss.ToString(b.Name), oss.ToString(b.StorageClass), oss.ToString(b.Location))
}
}
}
使用基础版API列举存储空间
您可以使用以下代码列举当前账号所有地域下的存储空间。
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 // 存储区域
)
// init 函数用于初始化命令行参数
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
// 解析命令行参数
flag.Parse()
// 检查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 marker string = ""
// 创建 ListBucketsRequest 请求
request := &oss.ListBucketsRequest{
Prefix: oss.Ptr(""),
MaxKeys: 10,
Marker: &marker,
}
// 列举当前账号所有地域下的存储空间
for {
lsRes, err := client.ListBuckets(context.TODO(), request)
if err != nil {
log.Fatalf("Failed to list buckets: %v", err)
}
for _, bucket := range lsRes.Buckets {
log.Printf("Bucket: %s", *bucket.Name)
}
if !lsRes.IsTruncated {
break
}
marker = *lsRes.NextMarker
}
log.Println("List buckets successfully!")
}
常见使用场景
列举指定前缀的存储空间
使用分页器Paginator
您可以使用以下代码列举当前账号所有地域下,以example为前缀(prefix)的存储空间。
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 // 存储区域
)
// init函数用于初始化命令行参数
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
// 解析命令行参数
flag.Parse()
// 检查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.ListBucketsRequest{
Prefix: oss.Ptr("example"), // 设置前缀为"example",只列出名称以该prefix开头的存储空间
}
// 创建分页器
p := client.NewListBucketsPaginator(request)
var i int
log.Println("Buckets:")
// 遍历分页器中的每一页
for p.HasNext() {
i++
// 获取下一页的数据
page, err := p.NextPage(context.TODO())
if err != nil {
log.Fatalf("failed to get page %v, %v", i, err)
}
// 打印该页中的每个存储空间的信息
for _, b := range page.Buckets {
log.Printf("Bucket: %v, StorageClass: %v, Location: %v\n", oss.ToString(b.Name), oss.ToString(b.StorageClass), oss.ToString(b.Location))
}
}
}
使用ListBuckets
您可以使用以下代码列举当前账号所有地域下,以example为前缀(prefix)的存储空间。
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 // 存储区域
)
// init 函数用于初始化命令行参数
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
// 解析命令行参数
flag.Parse()
// 检查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 marker string = ""
// 创建 ListBucketsRequest 请求
request := &oss.ListBucketsRequest{
Prefix: oss.Ptr("example"),
MaxKeys: 10,
Marker: &marker,
}
// 列举当前账号所有地域下的存储空间
for {
lsRes, err := client.ListBuckets(context.TODO(), request)
if err != nil {
log.Fatalf("Failed to list buckets: %v", err)
}
for _, bucket := range lsRes.Buckets {
log.Printf("Bucket: %s", *bucket.Name)
}
if !lsRes.IsTruncated {
break
}
marker = *lsRes.NextMarker
}
log.Println("List buckets successfully!")
}
列举指定marker之后的存储空间
使用分页器Paginator
您可以使用以下代码列举当前账号所有地域下,名称的字母序排在example-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 // 存储区域
)
// init函数用于初始化命令行参数
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
// 解析命令行参数
flag.Parse()
// 检查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.ListBucketsRequest{
Marker: oss.Ptr("example-bucket"), // 设置marker为"example-bucket",从该marker开始列出存储空间
}
// 创建分页器
p := client.NewListBucketsPaginator(request)
var i int
log.Println("Buckets:")
// 遍历分页器中的每一页
for p.HasNext() {
i++
// 获取下一页的数据
page, err := p.NextPage(context.TODO())
if err != nil {
log.Fatalf("failed to get page %v, %v", i, err)
}
// 打印该页中的每个存储空间的信息
for _, b := range page.Buckets {
log.Printf("Bucket: %v, StorageClass: %v, Location: %v\n", oss.ToString(b.Name), oss.ToString(b.StorageClass), oss.ToString(b.Location))
}
}
}
使用ListBuckets
您可以使用以下代码列举当前账号所有地域下,名称的字母序排在example-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 // 存储区域
)
// init 函数用于初始化命令行参数
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
// 解析命令行参数
flag.Parse()
// 检查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 marker string = "example-bucket"
// 创建 ListBucketsRequest 请求
request := &oss.ListBucketsRequest{
Marker: &marker,
}
// 列举当前账号所有地域下的存储空间
for {
lsRes, err := client.ListBuckets(context.TODO(), request)
if err != nil {
log.Fatalf("Failed to list buckets: %v", err)
}
for _, bucket := range lsRes.Buckets {
log.Printf("Bucket: %s", *bucket.Name)
}
if !lsRes.IsTruncated {
break
}
marker = *lsRes.NextMarker
}
log.Println("List buckets successfully!")
}
列举指定个数的存储空间
使用ListBuckets
您可以使用以下代码列举当前账号所有地域下的存储空间,并指定每次分页返回的最大数量。
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 // 存储区域
)
// init 函数用于初始化命令行参数
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
// 解析命令行参数
flag.Parse()
// 检查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 marker string = ""
// 创建 ListBucketsRequest 请求
request := &oss.ListBucketsRequest{
Marker: &marker,
MaxKeys: 10, // 每次列举返回的最大数量
}
// 列举当前账号所有地域下的存储空间
for {
lsRes, err := client.ListBuckets(context.TODO(), request)
if err != nil {
log.Fatalf("Failed to list buckets: %v", err)
}
for _, bucket := range lsRes.Buckets {
log.Printf("Bucket: %s", *bucket.Name)
}
if !lsRes.IsTruncated {
break
}
marker = *lsRes.NextMarker
}
log.Println("List buckets successfully!")
}
相关文档
关于列举存储空间的完整示例代码,请参见GitHub示例。
关于高级版列举存储空间的API接口,请参见NewListBucketsPaginator。
关于基础版列举存储空间的API接口,请参见ListBuckets。
关于分页器的更多信息,请参见开发者指南。