MinIO Go 客户端 API

embedded/2025/2/27 3:24:16/

MinIO 是一个基于 Apache License v2.0 开源协议的对象存储服务,与 Amazon S3 云存储服务兼容,适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器 / 虚拟机镜像等。在 Go 语言中,可以使用 MinIO 官方提供的 Go 客户端库与 MinIO 服务进行交互。以下是关于在 Go 语言中使用 MinIO 的详细代码如下介绍:

package minioimport ("bytes""context""fmt""github.com/minio/minio-go/v7""github.com/minio/minio-go/v7/pkg/credentials""io""log""net/url""os""path""time"
)type Minio struct {client     *minio.Client // 连接对象bucketName string // 桶名称
}// NewMinio ...
// endpoint 连接地址;accessKey 访问key;secret 访问密钥;bucketName 桶名称
func NewMinio(endpoint, accessKey, secret, bucketName string) Minio {// Initialize minio client object.minioClient, err := minio.New(endpoint, &minio.Options{Creds:  credentials.NewStaticV4(accessKey, secret, ""),Secure: false,})if err != nil {log.Fatal("文件服务连接失败;err=", err)}return Minio{client: minioClient,//logger:     logger,bucketName: bucketName,}
}// CreateBucket 创建桶
func (m Minio) CreateBucket(ctx context.Context) error {err := m.client.MakeBucket(ctx, m.bucketName, minio.MakeBucketOptions{Region: "cn-north-1"})if err != nil {// 检查存储桶是否已存在,若已存在导致的错误则忽略if exists, errExists := m.BucketExists(ctx, m.bucketName); errExists == nil && exists {return nil}return fmt.Errorf("创建存储桶失败: %v", err)}//m.logger.Info("存储桶 %s 创建成功\n", m.bucketName)return nil
}// ListBuckets 查询桶列表
func (m Minio) ListBuckets(ctx context.Context) ([]minio.BucketInfo, error) {buckets, err := m.client.ListBuckets(ctx)if err != nil {return nil, err}return buckets, nil
}// BucketExists 检查桶是否存在
func (m Minio) BucketExists(ctx context.Context, bucketName string) (bool, error) {found, err := m.client.BucketExists(ctx, bucketName)if err != nil {fmt.Println(err)return false, err}return found, nil
}// RemoveBucket 删除桶
func (m Minio) RemoveBucket(ctx context.Context) error {isExist, err := m.BucketExists(ctx, m.bucketName)if err != nil {fmt.Printf("Check %s err:%s", m.bucketName, err.Error())return err}if isExist {fmt.Printf("%s exists! Start delete....\n", m.bucketName)// 删除if err = m.client.RemoveBucket(ctx, m.bucketName); err != nil {fmt.Printf("Fail to remove %s:%s\n", m.bucketName, err.Error())return err}fmt.Printf("Success to remove %s\n", m.bucketName)} else {fmt.Printf("%s not exists!\n", m.bucketName)}return nil
}// UploadObject 上传文件对象
func (m Minio) UploadObject(ctx context.Context, objectName string, file *os.File) (*minio.UploadInfo, error) {fileStat, err := file.Stat()if err != nil {return nil, err}fileType := "application/octet-stream"switch path.Ext(objectName) {case ".jpg", ".jpeg":fileType = "image/jpeg"case ".png":fileType = "image/png"case ".gif":fileType = "image/gif"case ".webp":fileType = "image/webp"case ".mp4":fileType = "video/mp4"case ".avi":fileType = "video/avi"case ".pdf":fileType = "application/pdf"case ".doc":fileType = "application/msword"}// upload the fileuploadInfo, err := m.client.PutObject(ctx,m.bucketName,objectName,file,fileStat.Size(),minio.PutObjectOptions{ContentType: fileType})return &uploadInfo, err
}// ReadObject 获取文件对象
func (m Minio) ReadObject(ctx context.Context, objectName string) ([]byte, error) {contentBuffer, err := m.client.GetObject(ctx, m.bucketName, objectName, minio.GetObjectOptions{})if err != nil {return nil, err}// read the content from the buffercontentBytes := new(bytes.Buffer)if _, err = io.Copy(contentBytes, contentBuffer); err != nil {return nil, err}return contentBytes.Bytes(), nil
}// StateObjects 查询文件信息
func (m Minio) StateObjects(ctx context.Context, objectName string) (*minio.ObjectInfo, error) {objInfo, err := m.client.StatObject(ctx, m.bucketName, objectName, minio.StatObjectOptions{})if err != nil {return nil, err}return &objInfo, err
}// PresignedGetObject 创建预览地址
func (m Minio) PresignedGetObject(ctx context.Context, objectName string) (*url.URL, error) {reqParams := make(url.Values)// 若需要生成的链接直接下载文件的把下面的注释打开,需要预览的则不需要打开//reqParams.Set("response-content-disposition", "attachment; filename="+path.Base(objectName))// Generates a presigned url which expires in a day.presignedURL, err := m.client.PresignedGetObject(ctx, m.bucketName, objectName, time.Second*24*60*60, reqParams)if err != nil {return nil, err}return presignedURL, err
}// RemoveObject 删除文件对象
func (m Minio) RemoveObject(ctx context.Context, objectName string) error {opts := minio.RemoveObjectOptions{}err := m.client.RemoveObject(ctx, m.bucketName, objectName, opts)if err != nil {fmt.Println(err)return err}return nil
}

官网API地址MinIO Go Client API Reference — MinIO中文文档 | MinIO Linux中文文档


http://www.ppmy.cn/embedded/167430.html

相关文章

防火墙各项指标代表什么意思

防火墙常见指标配置及其含义解析 1. 源地址对象(Source Address) 含义:流量的来源IP地址或IP地址范围。作用:定义哪些IP地址或网络段的流量可以被允许或拒绝。示例: 单个IP:192.168.1.1IP范围:…

【力扣】2506:统计相似字符串对的数目

【力扣算法】2506:统计相似字符串对的数目 题目: 给你一个下标从 0 开始的字符串数组 words 。 如果两个字符串由相同的字符组成,则认为这两个字符串 相似 。 例如,"abca" 和 "cba" 相似,因为…

鸿蒙实战篇-解决报错提示“code:9568305 error: dependent module does not exist”

大家好,这里是鸿蒙开天组,好久不见了,前段时间比较忙,所以没怎么发过文,今天咱们先来个过年后的好头,发一篇简单又实用的实战文吧! 一、问题现象: 相信有部分可能都遇到过这么一个…

一周学会Flask3 Python Web开发-Jinja2模板访问对象

锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 如果渲染模板传的是对象,如果如何来访问呢? 我们看下下面示例: 定义一个Student类 cla…

【Linux】34.封装 UdpSocket(1)

文章目录 1. 实现一个简易的远程命令执行系统1.1 日志系统 (Log.hpp)1.2 UDP客户端 (UdpClient.cc)1.3 UDP服务器 (UdpServer.hpp)1.4 主程序 (main.c) 1. 实现一个简易的远程命令执行系统 1.1 日志系统 (Log.hpp) Log.hpp #pragma once // 防止头文件重复包含// 必要的头文…

存储产品和数据库产品之间有没有竞争关系

互联网各领域资料分享专区(不定期更新): Sheet 前言 存储产品通常指用于数据存储的硬件或软件解决方案,比如硬盘、NAS、SAN,或者云存储服务如Amazon S3、阿里云OSS。它们主要关注数据的持久化、可扩展性、可靠性和访问速度,但可能不提供复杂的数据处理功能。数据库产品则是…

功能测试-黑盒测试

黑盒测试是一种功能测试方法,它将软件视为一个“黑盒”,即测试人员不关心软件的内部结构和实现,细节只关注软件的输入和输出是否符合预期。以下是黑盒测试方法的详细解释: 1. 黑盒测试的核心理念 黑盒测试的核心在于验证软件的功…

HTML Application(hta)入门教程

简介 HTA是HTML Application的缩写,又称为HTML应用程序。 hta是一个可执行文件,双击可以直接运行 hta与html非常相似,可直接将文件后缀改为.hta来获得HTA格式的文件。 支持VBS和JavaScript html的权限被限制在网页浏览器内,只有操…