本文将演示如何使用 AWS SDK for Go v2 从兼容 S3 协议的对象存储服务(如 MinIO)中下载文件。

前提条件

  • 已部署 MinIO 或其他 S3 兼容服务(单机或集群)
  • 已创建 Bucket,并拥有 AccessKey / SecretKey
  • 项目中已引入 AWS SDK for Go v2 相关依赖:
go get github.com/aws/aws-sdk-go-v2/config
go get github.com/aws/aws-sdk-go-v2/credentials
go get github.com/aws/aws-sdk-go-v2/service/s3

重要说明

MinIO、Ceph RGW、阿里云 OSS(需开启 S3 兼容模式)、腾讯云 COS 等支持 S3 API 的对象存储服务都可以使用该代码实现文件下载,只需正确配置 Endpoint、访问凭证(Credentials)即可。

核心代码

ctx := context.Background()

// 加载自定义配置:凭证、区域和 Endpoint
cfg, err := config.LoadDefaultConfig(ctx,
	config.WithCredentialsProvider(
		credentials.NewStaticCredentialsProvider(
			local_config.AppConfig.Minio.AccessKey, // 替换为你的 Access Key
			local_config.AppConfig.Minio.SecretKey, // 替换为你的 Secret Key
			"",                                     // Session Token(MinIO 通常不需要,留空即可)
		),
	),
	config.WithRegion(local_config.AppConfig.Minio.Region),         // 指定区域(MinIO 可任意填写,但不能为空)
	config.WithBaseEndpoint(local_config.AppConfig.Minio.Endpoint), // MinIO 服务地址,例如 http://localhost:9000
)
if err != nil {
	fmt.Println("加载配置失败:", err)
	return
}

// 创建 S3 客户端
client := s3.NewFromConfig(cfg)

// 发起 GetObject 请求
resp, err := client.GetObject(ctx, &s3.GetObjectInput{
	Bucket: aws.String(localCfg.Storage.BucketName),
	Key:    aws.String(fileName),
})
if err != nil {
	fmt.Println("获取对象失败:", err)
	return
}
defer resp.Body.Close() // 别忘了关闭响应体

// 读取文件内容
body, err := io.ReadAll(resp.Body)
if err != nil {
	fmt.Println("读取响应体失败:", err)
	return
}

// 此时 body 中即为下载的文件内容
// 可根据需要写入本地文件、返回 HTTP 响应等
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐