当前位置: 代码网 > it编程>前端脚本>Golang > Go语言封装MinIO相关操作详解

Go语言封装MinIO相关操作详解

2025年02月15日 Golang 我要评论
背景介绍minio 是一个高性能的对象存储服务,兼容 amazon s3 api,广泛用于存储和管理海量数据。在实际开发中,封装一个便于使用的 minio 操作包,可以帮助我们简化操作逻辑,提高代码的

背景介绍

minio 是一个高性能的对象存储服务,兼容 amazon s3 api,广泛用于存储和管理海量数据。在实际开发中,封装一个便于使用的 minio 操作包,可以帮助我们简化操作逻辑,提高代码的可读性和复用性。

本文将介绍如何用 go 语言封装一个简单的 minio 操作包,支持以下功能:

  • 初始化 minio 客户端
  • 上传文件
  • 下载文件
  • 列出文件
  • 删除文件
  • 获取文件的预签名 url

代码实现

结构体定义

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 客户端

通过 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 []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
}

删除文件

通过 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 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)
    }

    // 获取预签名 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)
}

总结

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

到此这篇关于go语言封装minio相关操作详解的文章就介绍到这了,更多相关go封装minio内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com