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/

标签