Go語(yǔ)言封裝MinIO相關(guān)操作詳解
背景介紹
MinIO 是一個(gè)高性能的對(duì)象存儲(chǔ)服務(wù),兼容 Amazon S3 API,廣泛用于存儲(chǔ)和管理海量數(shù)據(jù)。在實(shí)際開(kāi)發(fā)中,封裝一個(gè)便于使用的 MinIO 操作包,可以幫助我們簡(jiǎn)化操作邏輯,提高代碼的可讀性和復(fù)用性。
本文將介紹如何用 Go 語(yǔ)言封裝一個(gè)簡(jiǎn)單的 MinIO 操作包,支持以下功能:
- 初始化 MinIO 客戶端
- 上傳文件
- 下載文件
- 列出文件
- 刪除文件
- 獲取文件的預(yù)簽名 URL
代碼實(shí)現(xiàn)
結(jié)構(gòu)體定義
package minio_wrapper import ( "context" "fmt" "log" "time" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" ) type MinioClient struct { client *minio.Client bucket string location string }
初始化 MinIO 客戶端
通過(guò) NewMinioClient 方法,可以根據(jù)配置參數(shù)初始化 MinIO 客戶端,并確保指定的存儲(chǔ)桶存在。如果存儲(chǔ)桶不存在,會(huì)自動(dòng)創(chuàng)建。
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 }
上傳文件
通過(guò) UploadFile 方法,可以將本地文件上傳到指定存儲(chǔ)桶中。
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 }
下載文件
通過(guò) DownloadFile 方法,可以將存儲(chǔ)桶中的文件下載到本地指定路徑。
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 }
列出文件
通過(guò) ListFiles 方法,可以列出存儲(chǔ)桶中的所有文件。
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 []string for 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 }
刪除文件
通過(guò) DeleteFile 方法,可以刪除存儲(chǔ)桶中的指定文件。
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 }
獲取文件的預(yù)簽名 URL
通過(guò) GetFileURL 方法,可以生成文件的預(yù)簽名 URL,便于臨時(shí)訪問(wèn)私有文件。
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 }
使用示例
以下是一個(gè)完整的使用示例:
package main import ( "log" "minio_wrapper" "time" ) func main() { endpoint := "127.0.0.1:9000" accessKeyID := "minioadmin" secretAccessKey := "minioadmin" bucket := "mybucket" location := "us-east-1" useSSL := false client, 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) } // 獲取預(yù)簽名 URL url, 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) }
總結(jié)
通過(guò)封裝 MinIO 的常用操作,我們可以極大簡(jiǎn)化代碼邏輯,提高開(kāi)發(fā)效率。在實(shí)際項(xiàng)目中,可以根據(jù)需求進(jìn)一步擴(kuò)展功能,例如支持更多的操作、增加日志功能或通過(guò)配置文件動(dòng)態(tài)加載參數(shù)等。
到此這篇關(guān)于Go語(yǔ)言封裝MinIO相關(guān)操作詳解的文章就介紹到這了,更多相關(guān)Go封裝MinIO內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang?struct?json?tag的使用以及深入講解
這篇文章主要給大家介紹了關(guān)于golang?struct?json?tag的使用以及深入講解,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02在Go中實(shí)現(xiàn)和使用堆棧以及先進(jìn)先出原則詳解
Go是一種功能強(qiáng)大的編程語(yǔ)言,提供了豐富的數(shù)據(jù)結(jié)構(gòu)和算法,堆棧是計(jì)算機(jī)科學(xué)中的基本數(shù)據(jù)結(jié)構(gòu)之一,在本博文中,我們將探討如何在?Go?中實(shí)現(xiàn)和使用堆棧,以及堆棧如何遵循先進(jìn)先出?(FIFO)?原則2023-10-10Go關(guān)鍵字defer的使用和底層實(shí)現(xiàn)
defer是Go語(yǔ)言的關(guān)鍵字,一般用于資源的釋放和異常的捕捉,defer語(yǔ)句后將其后面跟隨的語(yǔ)句進(jìn)行延遲處理,就是說(shuō)在函數(shù)執(zhí)行完畢后再執(zhí)行調(diào)用,也就是return的ret指令之前,本文給大家介紹了Go關(guān)鍵字defer的使用和底層實(shí)現(xiàn),需要的朋友可以參考下2023-11-11Go初學(xué)者踩坑之go?mod?init與自定義包的使用
go?mod是go的一個(gè)模塊管理工具,用來(lái)代替?zhèn)鹘y(tǒng)的GOPATH方案,下面這篇文章主要給大家介紹了關(guān)于Go初學(xué)者踩坑之go?mod?init與自定義包的使用,需要的朋友可以參考下2022-10-10go redis實(shí)現(xiàn)滑動(dòng)窗口限流的方式(redis版)
這篇文章主要介紹了go redis實(shí)現(xiàn)滑動(dòng)窗口限流的方式(redis版),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12