用于在Go中操作S3及云存储的minio-go库
在现代开发中,越来越需要与兼容Amazon S3(简单存储服务)协议的云存储进行集成。无论是AWS S3、Yandex.Cloud、DigitalOcean Spaces、MinIO还是任何其他S3兼容服务,Go语言都提供了一个优雅且高性能的解决方案——minio-go库。
Minio-go是由MinIO公司开发的Amazon S3 API的官方Go客户端。它提供了一整套用于管理存储桶和对象的功能,支持流式上传/下载、加密、版本控制以及S3的许多其他功能。该库完全兼容AWS S3和任何其他S3兼容存储。
安装
通过标准的go get方式安装该库:
go get github.com/minio/minio-go/v7连接与客户端配置
首先,需要创建一个客户端,指定端点、访问密钥和秘密密钥。连接到MinIO(本地或云端)的示例:
package main
import ( "context" "log" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials")
func main() { ctx := context.Background() // 连接参数 endpoint := "play.min.io" // 或您的端点 accessKeyID := "Q3AM3UQ867SPQQA43P2F" secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG" useSSL := true
// 创建客户端 client, err := minio.New(endpoint, &minio.Options{ Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""), Secure: useSSL, }) if err != nil { log.Fatalf("创建客户端时出错: %v", err) }
log.Println("已建立与S3存储的连接")}操作存储桶
存储桶(bucket)是S3存储中的根目录。我们来看一下基本操作:
创建存储桶
bucketName := "my-go-bucket"location := "us-east-1"
err = client.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{ Region: location,})if err != nil { log.Printf("无法创建存储桶: %v", err)} else { log.Printf("存储桶 '%s' 创建成功", bucketName)}检查存储桶是否存在
exists, err := client.BucketExists(ctx, bucketName)if err != nil { log.Fatalf("检查存储桶时出错: %v", err)}if exists { log.Printf("存储桶 '%s' 存在", bucketName)}列出所有存储桶
buckets, err := client.ListBuckets(ctx)if err != nil { log.Fatalf("获取存储桶列表时出错: %v", err)}for _, bucket := range buckets { log.Printf("存储桶: %s, 创建时间: %s", bucket.Name, bucket.CreationDate)}上传文件
Minio-go支持从本地文件系统、io.Reader以及内存缓冲区上传文件。文件上传示例:
objectName := "example.txt"filePath := "/path/to/local/file.txt"contentType := "text/plain"
// 上传文件n, err := client.FPutObject(ctx, bucketName, objectName, filePath, minio.PutObjectOptions{ ContentType: contentType,})if err != nil { log.Fatalf("上传文件时出错: %v", err)}log.Printf("文件 '%s' 已上传,大小: %d 字节", objectName, n.Size)从内存上传(bytes/reader)
import "strings"
data := strings.NewReader("你好,S3存储!")objectName := "hello.txt"
n, err := client.PutObject(ctx, bucketName, objectName, data, int64(data.Len()), minio.PutObjectOptions{ ContentType: "text/plain",})if err != nil { log.Fatalf("上传数据时出错: %v", err)}log.Printf("已上传 %d 字节", n.Size)