【golang】兼容AWS S3的存储桶文件下载
·
本文将演示如何使用 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 响应等
更多推荐
所有评论(0)