使用 Go 语言封装 MinIO 相关操作

server/2024/11/29 4:19:12/

目录

  • 使用 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 的常用操作,我们可以极大简化代码逻辑,提高开发效率。在实际项目中,可以根据需求进一步扩展功能,例如支持更多的操作、增加日志功能或通过配置文件动态加载参数等。


http://www.ppmy.cn/server/145811.html

相关文章

鸿蒙进阶篇-状态管理之@Prop@Link

大家好啊,这里是鸿蒙开天组,今天我们来学习状态管理。 开始组件化开发之后,如何管理组件的状态会变得尤为重要,咱们接下来系统的学习一下这部分的内容 状态管理机制 在声明式UI编程框架中,UI是程序状态的运行结果&a…

【网络安全】

黑客入侵 什么是黑客入侵? “黑客”是一个外来词,是英语单词hacker的中文音译。最初,“黑客”只是一个褒义词,指的是那些尽力挖掘计算机程序最大潜力的点脑精英,他们讨论软件黑客的技巧和态度,以及共享文化…

【C++】类(三):类的其它特性

7.3 类的其它特性 本节将继续介绍之前章节当中 Sales_data 没有体现出来的类的特性,包括:类型成员、类的成员的类内初始值、可变数据成员、内联成员函数、从成员函数返回*this、如何定义并使用类类型及友元类等。 7.3.1 类成员再探 这部分定义了一对相…

Docker的save和export命令的区别,load和import的区别 笔记241124

Docker的save和export命令的区别,load和import的区别 解说1: Docker的save和export命令,以及load和import命令,在功能和使用场景上存在显著的区别。以下是对这两组命令的详细对比和解释: Docker save和export命令的区别 使用方式和目的&am…

泛型擦除是什么?

泛型擦除(Type Erasure)是Java编译器在编译泛型代码时的一种机制,它的目的是确保泛型能够与JAVA的旧版本(即不支持泛型的版本)兼容。泛型擦除会在编译时移除泛型类型信息,并将泛型类型替换为其非泛型的上限类型(通常是Object) 详细解释 在Java中&#…

Spring 小案例体验创建对象的快感(Java EE 学习笔记05)

我们了解了Spring的特性及功能后,接下来我们利用下面的小案例来体验以下Spring的使用方式。 首先创建项目 打开IDEA,选择new工程,如下图: ​ 然后,指定工程名字为SpringDemo,并且指定工程目录为D盘。配…

【Python爬虫五十个小案例】爬取豆瓣电影Top250

博客主页:小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介:分享五十个Python爬虫小案例 🪲前言 在这篇博客中,我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求,…

Spring Boot开发实战:从入门到构建高效应用

Spring Boot 是 Java 开发者构建微服务、Web 应用和后端服务的首选框架之一。其凭借开箱即用的特性、大量的自动化配置和灵活的扩展性,极大简化了开发流程。本文将以实战为核心,从基础到高级,全面探讨 Spring Boot 的应用开发。 一、Spring B…