golang连接minio,实现创建桶、上传和下载功能

golang连接minio,实现创建桶、上传和下载功能

minio关于golang的sdk,参看:https://min.io/docs/minio/linux/developers/go/API.html

minio的基本操作,参看往期文章:https://www.madbull.site/?p=792

创建 tminio.go 文件,代码如下,需要修改endpoint、accesskey、secretkey配置。


// go run tminio.go

package main

import (
    "github.com/minio/minio-go/v7"
    "github.com/minio/minio-go/v7/pkg/credentials"
    "github.com/kataras/golog"
    "context"
    "io"
    "strings"
    "path/filepath"
)

func main() {
    GetConnectClient()
    SaveFileContentToMinio("tt.txt", "test", "ssssssssuuuuuuuuuyyyyyyysssssssssssssssyyyyyyyysssssss\n")
    DownloadFileFromMinio("tt.txt", "test", "/tmp")
}

var MinioClient *minio.Client = nil

var endpoint = "HOST:PORT"
var accessKeyId = "accesskey"
var secretAccessKey = "secretkey"
var useSSL = false


/*
 * 根据配置文件初始化 minio 客户端连接池
 */
func GetConnectClient() *minio.Client {

    mc, err := minio.New( endpoint, &minio.Options{
        Creds:  credentials.NewStaticV4( accessKeyId, secretAccessKey, "" ),
        Secure: useSSL,
    })
    if err != nil {
        golog.Error(err)
        golog.Println("connect minio failed !")
    }
    MinioClient = mc
    return MinioClient

}

/*
 * 如果 bucket 不存在,则创建 bucket
 */
func makeBucketIfNotExists(ctx context.Context, MinioClient *minio.Client, bucketName string) bool {

    found, err := MinioClient.BucketExists(ctx, bucketName)
    if err != nil {
        golog.Error(err)
        return false
    }
    if found {
        golog.Debug("Bucket found " + bucketName )
        return true
    }
    err = MinioClient.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{})
    if err != nil {
        golog.Error(err)
        return false
    }
    return true
}

/*
 * 保存数据到指定 bucket 的指定文件
 */
func SaveFileContentToMinio(filename string, bucketName string, fileContent string) bool {

    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    ret := makeBucketIfNotExists(ctx, MinioClient, bucketName)
    if ret == false {
        golog.Error("makeBucketIfNotExists failed !")
        return false
    }

    var buffer io.Reader = strings.NewReader(fileContent)
    _, err := MinioClient.PutObject(ctx, bucketName, filename, buffer, -1, minio.PutObjectOptions{})
    if err != nil {
        golog.Errorf("put %s %s failed !", bucketName, filename)
        golog.Error(err)
        return false
    }

    golog.Info("Successfully uploaded ! ")
    return true
}

/*
 * 从minio中下载文件
 */
func DownloadFileFromMinio(filename string, bucketName string, path string) bool {

    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    fullpath := filepath.Join(path, filename)
    err := MinioClient.FGetObject(ctx, bucketName, filename, fullpath, minio.GetObjectOptions{} )

    if err != nil {
        golog.Errorf("download %s %s failed !", bucketName, filename)
        golog.Error(err)
        return false
    }

    golog.Info("Successfully download : " + bucketName + "  " + fullpath + " !")
    return true 
}

创建 go.mod 文件,代码只有一行,如下

module tminio

测试结果

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注