在 Go (Golang) 中操作 S3 和云存储
兼容 Amazon S3 协议的云对象存储已成为存储非结构化数据(如图像、视频、日志、备份)的事实标准。在 Go (Golang) 生态系统中,有多个强大的库可用于与 S3 交互,使您能够轻松地将云存储集成到您的应用程序中。在本文中,我们将介绍两个主要的库:minio-go 和 aws-sdk-go-v2,并提供实际使用示例。
1. minio-go 库
MinIO 是一个高性能的开源对象存储,完全兼容 Amazon S3 API。其客户端库 minio-go 是在 Go 中操作 S3 最流行的库之一。它支持所有基本操作:创建和删除存储桶、上传、下载和删除对象,以及处理访问策略。
安装库:
go get github.com/minio/minio-go/v7示例:连接并上传文件
package main
import ( "context" "log"
"github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials")
func main() { ctx := context.Background()
// 指定您的 S3 兼容存储的 endpoint、access key 和 secret key endpoint := "play.min.io" accessKeyID := "Q3AM3UQ867SPQQA43P2F" secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG" useSSL := true
// 初始化客户端 minioClient, err := minio.New(endpoint, &minio.Options{ Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""), Secure: useSSL, }) if err != nil { log.Fatalln(err) }
// 创建存储桶(如果不存在) bucketName := "my-bucket" err = minioClient.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{}) if err != nil { // 检查存储桶是否已存在 exists, errBucketExists := minioClient.BucketExists(ctx, bucketName) if errBucketExists == nil && exists { log.Printf("存储桶 %s 已存在", bucketName) } else { log.Fatalln(err) } }
// 上传文件 objectName := "myfile.txt" filePath := "/tmp/myfile.txt" contentType := "text/plain"
n, err := minioClient.FPutObject(ctx, bucketName, objectName, filePath, minio.PutObjectOptions{ ContentType: contentType, }) if err != nil { log.Fatalln(err) }
log.Printf("成功上传 %s,大小为 %d", objectName, n)}2. AWS SDK for Go v2 库
Amazon 官方 SDK (aws-sdk-go-v2) 提供了用于操作 AWS 服务(包括 S3)的完整工具集。它支持 S3 的所有功能,包括多线程上传、加密和版本管理。SDK 使用基于模型的代码生成,确保了高性能和强类型。
安装:
go get github.com/aws/aws-sdk-go-v2go get github.com/aws/aws-sdk-go-v2/configgo get github.com/aws/aws-sdk-go-v2/service/s3示例:使用 AWS SDK v2 上传文件
package main
import ( "context" "log" "os"
"github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/s3")
func main() { ctx := context.Background()
// 从环境变量或 ~/.aws/credentials 文件加载配置 cfg, err := config.LoadDefaultConfig(ctx) if err != nil { log.Fatalf("无法加载 SDK 配置, %v", err) }
// 创建 S3 客户端 client := s3.NewFromConfig(cfg)
// 打开要上传的文件 file, err := os.Ope