Go语言操作minio对象存储
Golang操作minio的文档地址:https://min.io/docs/minio/linux/developers/go/API.html#MakeBucket
首先安装minio,安装方式可参考:minio存储的使用 – 运维Devops (netoct.com),安装完成后创建access keys,用于在go中连接minio使用,如图:

golang中需要导入的库为:
github.com/minio/minio-go/v7
github.com/minio/minio-go/v7/pkg/credentials
查看库的用法可使用命令如下:
go doc v7
1、下面例子表示连接minio,并创建存储桶,如下:
package main
import (
"context"
"fmt"
"log"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
func main() {
ctx := context.Background()
endpoint := "127.0.0.1:9000"
accessKeyID := "tCuwOKQeKcJXV0NJZwIi"
secretAccessKey := "BEAqgXjPd9fU754F8zYtF48qujG4uVkKzLe4NvNc"
useSSL := false
// Initialize minio client object.
minioClient, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
Secure: useSSL,
})
if err != nil {
log.Fatalln(err)
}
err = minioClient.MakeBucket(ctx, "mybucket", minio.MakeBucketOptions{
Region: "us-east-1",ObjectLocking: true
})
if err != nil {
log.Fatal(err)
}
fmt.Println("mybucket created success")
}
- context.Background():控制请求周期,可跟踪和取消goroutine
- endpoint:要连接的Minio存储地址
- accessKeyID和secretAccessKey:在登录后的页面中创建的
- useSSL:如果minio存储不是httpd方式,那就设置为false
- New():此函数用来初始化minio客户端
- MakeBucket:创建存储桶,mybucket为自定义的存储桶名字
- Region:表示定义存储桶区域
执行完成后,在界面即可查看到存储桶,如图:

2、列出存储桶,只显示部分内容,其余部分与第一个例子一样,如下:
buckets, err := minioClient.ListBuckets(ctx)
if err != nil {
log.Fatal(err)
}
for _, bucket := range buckets {
fmt.Println(bucket)
}
- ListBuckets():列出存储桶,返回一个存储桶切片

3、检查存储桶是否存在,通过BucketExists()方法,如下:
found, err := minioClient.BucketExists(ctx, "mybucket")
if err != nil {
log.Fatal(err)
}
if found {
fmt.Println("存储桶存在")
}
- BucketExists:检测存储桶是否存在

4、移除存储桶,通过RemoveBucket()方法,如下:
//先移除
err = minioClient.RemoveBucket(ctx, "mybucket")
if err != nil {
log.Fatal(err)
}
//检测是否存在
found, err := minioClient.BucketExists(ctx, "mybucket")
if err != nil {
log.Fatal(err)
}
if !found {
fmt.Println("存储桶已经被移除了")
}
- RemoveBucket:移除存储桶

5、上传文件到存储桶中,通过PutObject()方法,语法如下:
func (c *Client) PutObject(ctx context.Context, bucketName, objectName string, reader io.Reader, objectSize int64,
opts PutObjectOptions,
) (info UploadInfo, err error)
file, err := os.Open("/root/oamp-20230104.tgz")
if err != nil {
log.Fatal(err)
}
defer file.Close()
fileinfo, err := file.Stat()
if err != nil {
log.Fatal(err)
}
uploadinfo, err := minioClient.PutObject(ctx, "bucket1", fileinfo.Name(), file, fileinfo.Size(), minio.PutObjectOptions{ContentType: "application/octet-stream"})
if err != nil {
log.Fatal(err)
}
fmt.Println(uploadinfo)
- file:先通过os.Open打开文件
- fileinfo:获取文件的信息
- PutObject:上传对象的方法
- bucket1:上传文件到存储桶bucket1中
- fileinfo.Name():上传到存储桶后,在存储桶中显示的文件名
- file:要上传的文件
- fileinfo.Size():文件大小
- PutObjectOptions:上传对象的其他选项,这里设置ContentType为application/octet-stream
上传结果如下:

注:application/octet-stream 是一个互联网媒体类型(也称为 MIME 类型或内容类型),用于表示未知或不可识别的二进制数据。它是一种通用的二进制数据类型,没有特定的文件格式或结构,当服务器无法确定或不知道要传输的数据的确切类型时,通常会使用 application/octet-stream 这个默认的媒体类型,如果你要上传的是图片文件,那么就需要将Conent-Type设置为对应的图片类型才行,否则在浏览器访问图片的时候会提示下载,设置图片类型参考如下:
file, err := os.Open("abc.png")
if err != nil {
log.Fatal(err)
}
defer file.Close()
fileinfo, err := file.Stat()
if err != nil {
log.Fatal(err)
}
ext := filepath.Ext(fileinfo.Name())
//判断后缀名
if ext == ".png" {
uploadinfo, err := minioClient.PutObject(ctx, "bucket1", fileinfo.Name(), file, fileinfo.Size(), minio.PutObjectOptions{ContentType: "image/png"})
if err != nil {
log.Fatal(err)
}
fmt.Println(uploadinfo)
}
if ext == ".jpg" {
uploadinfo, err := minioClient.PutObject(ctx, "bucket1", fileinfo.Name(), file, fileinfo.Size(), minio.PutObjectOptions{ContentType: "image/jpeg"})
if err != nil {
log.Fatal(err)
}
fmt.Println(uploadinfo)
}
由于浏览器的限制,当上传文件时,设置header为application/octet-stream时,浏览器打开链接会默认进行下载而不是在浏览器中加载文件,所以如果想要文件时直接打开,上传时则不要设置application/octet-stream,常见的格式类型可参考地址:https://blog.ywdevops.cn/index.php/2021/08/22/minio/


