目录
- 使用 Go 语言封装 MinIO 相关操作
- 背景介绍
- 代码实现
- 结构体定义
- 初始化 MinIO 客户端
- 上传文件
- 下载文件
- 列出文件
- 删除文件
- 获取文件的预签名 URL
- 使用示例
- 总结
使用 Go 语言封装 MinIO 相关操作
背景介绍
MinIO 是一个高性能的对象存储服务,兼容 Amazon S3 API,广泛用于存储和管理海量数据。在实际开发中,封装一个便于使用的 MinIO 操作包,可以帮助我们简化操作逻辑,提高代码的可读性和复用性。
本文将介绍如何用 Go 语言封装一个简单的 MinIO 操作包,支持以下功能:
- 初始化 MinIO 客户端
- 上传文件
- 下载文件
- 列出文件
- 删除文件
- 获取文件的预签名 URL
代码实现
结构体定义
package minio_wrapperimport ("context""fmt""log""time""github.com/minio/minio-go/v7""github.com/minio/minio-go/v7/pkg/credentials"
)type MinioClient struct {client *minio.Clientbucket stringlocation string
}
初始化 MinIO 客户端
通过 NewMinioClient
方法,可以根据配置参数初始化 MinIO 客户端,并确保指定的存储桶存在。如果存储桶不存在,会自动创建。
func NewMinioClient(endpoint, accessKeyID, secretAccessKey, bucket, location string, useSSL bool) (*MinioClient, error) {client, err := minio.New(endpoint, &minio.Options{Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),Secure: useSSL,})if err != nil {return nil, fmt.Errorf("failed to initialize minio client: %w", err)}ctx := context.Background()exists, err := client.BucketExists(ctx, bucket)if err != nil {return nil, fmt.Errorf("failed to check bucket existence: %w", err)}if !exists {err = client.MakeBucket(ctx, bucket, minio.MakeBucketOptions{Region: location})if err != nil {return nil, fmt.Errorf("failed to create bucket: %w", err)}log.Printf("Successfully created bucket: %s\n", bucket)}return &MinioClient{client: client,bucket: bucket,location: location,}, nil
}
上传文件
通过 UploadFile
方法,可以将本地文件上传到指定存储桶中。
func (mc *MinioClient) UploadFile(objectName, filePath, contentType string) error {ctx, cancel := context.WithTimeout(context.Background(), time.Minute)defer cancel()_, err := mc.client.FPutObject(ctx, mc.bucket, objectName, filePath, minio.PutObjectOptions{ContentType: contentType,})if err != nil {return fmt.Errorf("failed to upload file: %w", err)}log.Printf("Successfully uploaded %s to bucket %s\n", objectName, mc.bucket)return nil
}
下载文件
通过 DownloadFile
方法,可以将存储桶中的文件下载到本地指定路径。
func (mc *MinioClient) DownloadFile(objectName, filePath string) error {ctx, cancel := context.WithTimeout(context.Background(), time.Minute)defer cancel()err := mc.client.FGetObject(ctx, mc.bucket, objectName, filePath, minio.GetObjectOptions{})if err != nil {return fmt.Errorf("failed to download file: %w", err)}log.Printf("Successfully downloaded %s to %s\n", objectName, filePath)return nil
}
列出文件
通过 ListFiles
方法,可以列出存储桶中的所有文件。
func (mc *MinioClient) ListFiles() ([]string, error) {ctx, cancel := context.WithTimeout(context.Background(), time.Minute)defer cancel()objectCh := mc.client.ListObjects(ctx, mc.bucket, minio.ListObjectsOptions{})var objects []stringfor object := range objectCh {if object.Err != nil {return nil, fmt.Errorf("error listing object: %w", object.Err)}objects = append(objects, object.Key)}return objects, nil
}
删除文件
通过 DeleteFile
方法,可以删除存储桶中的指定文件。
func (mc *MinioClient) DeleteFile(objectName string) error {ctx, cancel := context.WithTimeout(context.Background(), time.Minute)defer cancel()err := mc.client.RemoveObject(ctx, mc.bucket, objectName, minio.RemoveObjectOptions{})if err != nil {return fmt.Errorf("failed to delete file: %w", err)}log.Printf("Successfully deleted %s from bucket %s\n", objectName, mc.bucket)return nil
}
获取文件的预签名 URL
通过 GetFileURL
方法,可以生成文件的预签名 URL,便于临时访问私有文件。
func (mc *MinioClient) GetFileURL(objectName string, expiry time.Duration) (string, error) {ctx, cancel := context.WithTimeout(context.Background(), time.Minute)defer cancel()reqParams := make(map[string]string)presignedURL, err := mc.client.PresignedGetObject(ctx, mc.bucket, objectName, expiry, reqParams)if err != nil {return "", fmt.Errorf("failed to generate presigned URL: %w", err)}log.Printf("Successfully generated URL for %s: %s\n", objectName, presignedURL)return presignedURL.String(), nil
}
使用示例
以下是一个完整的使用示例:
package mainimport ("log""minio_wrapper""time"
)func main() {endpoint := "127.0.0.1:9000"accessKeyID := "minioadmin"secretAccessKey := "minioadmin"bucket := "mybucket"location := "us-east-1"useSSL := falseclient, err := minio_wrapper.NewMinioClient(endpoint, accessKeyID, secretAccessKey, bucket, location, useSSL)if err != nil {log.Fatalf("Failed to initialize MinioClient: %v", err)}// 上传文件err = client.UploadFile("example.txt", "/path/to/local/file.txt", "text/plain")if err != nil {log.Fatalf("Failed to upload file: %v", err)}// 获取预签名 URLurl, err := client.GetFileURL("example.txt", time.Hour*1)if err != nil {log.Fatalf("Failed to get file URL: %v", err)}log.Printf("Presigned URL: %s", url)
}
总结
通过封装 MinIO 的常用操作,我们可以极大简化代码逻辑,提高开发效率。在实际项目中,可以根据需求进一步扩展功能,例如支持更多的操作、增加日志功能或通过配置文件动态加载参数等。