在Go中使用minio-go库操作S3及云存储

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

用于在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)

推荐