go操作minio

参考文章:docker-compose 搭建 minio 分布式对象存储 最新版(使用教程)_docker-compose minio-CSDN博客

安装minio

  1. 安装docker

    安装步骤详情请参考:使用docker搭建项目 | 柳门竹巷 (zhbblog.top)

    1
    2
    [root@localhost ~]# docker -v
    Docker version 24.0.6, build ed223bc
  2. 安装docker-compose

    安装步骤详情请参考:使用docker搭建项目 | 柳门竹巷 (zhbblog.top)

    1
    2
    [root@localhost ~]# docker-compose -v
    Docker Compose version v2.20.3
  3. 拉取minio镜像

    1
    docker pull minio/minio
  4. 创建minio对应文件夹

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 进入data目录
    cd /data
    # 创建minio目录
    mkdir minio
    # 进入minio目录
    cd minio
    # 在minio目录下创建data目录和config目录
    mkdir data
    mkdir config
  5. 编写docker-compose.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    version: '3'
    services:
    minio:
    image: minio/minio
    hostname: "minio"
    ports:
    - 9000:9000 # api端口
    - 9001:9001 # 控制台端口
    environment:
    MINIO_ACCESS_KEY: admin #管理后台用户名
    MINIO_SECRET_KEY: admin123 #管理后台密码,最小8个字符
    volumes:
    - /data/minio/data:/data #映射当前目录下的data目录至容器内/data目录
    - /data/minio/config:/root/.minio/ #映射配置目录
    command: server --console-address ':9001' /data #指定容器中的目录 /data
    privileged: true
    restart: always
  6. 在防火墙放行对应端口(如果防火墙开启的话)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 添加防火墙放行规则
    firewall-cmd --zone=public --add-port=9000/tcp --permanent
    firewall-cmd --zone=public --add-port=9001/tcp --permanent
    # 重新加载防火墙配置
    firewall-cmd --reload

    # 重启防火墙(如果有必要的话)
    systemctl restart firewalld
    # 或者
    service firewalld restart
    # 如果重启防火墙,可能导致需要重启docker
    systemctl restart docker
  7. 启动minio容器

    1
    2
    # 请在docker-compose.yml所在目录下执行
    docker-compose up -d minio
  8. 访问minio控制

    浏览器访问:服务器ip:9001,例如http://127.0.0.1:9001,账号密码为docker-compose.ymlMINIO_ACCESS_KEYMINIO_SECRET_KEY,例如本文中账号、密码为adminadmin123

操作minio

编写minioUtil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package minioUtil

import (
"context"
"fmt"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
"log"
"mime/multipart"
)

const (
endpoint string = "127.0.0.1:9000"
accessKeyID string = "admin"
secretAccessKey string = "admin123"
useSSL bool = false
urlPrefix string = "http://127.0.0.1:9000/"
)

var (
client *minio.Client
)

func init() {
c, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
Secure: useSSL,
})
if err != nil {
panic(fmt.Errorf("failed to connect to minio: %s", err))
}
client = c
}

// 检查存储桶,如果不存在则创建存储桶
// @param bucketName: 存储桶名称
// @return bool, error 是否成功, 可能出现的错误
func checkBucket(bucketName string) (bool, error) {
// 检查存储桶是否存在
if found, _ := client.BucketExists(context.Background(), bucketName); found {
return true, nil
}
// 创建存储桶
if err := client.MakeBucket(context.Background(), bucketName, minio.MakeBucketOptions{Region: "beijing"}); err != nil {
fmt.Println("Error creating bucket:", err)
return false, err
}
return true, nil
}

// 构建文件名
// @param objectName: 存储桶名称
// @return string 生成后的文件名
func buildFileName(objectName string) string {
index := strings.LastIndex(strings.TrimSpace(objectName), ".")
now := time.Now()
return fmt.Sprintf("%s/%s_%d%s", now.Format("2006/01/02"), objectName[:index], now.UnixNano(), objectName[index:])
}

// UploadFile 将给定的文件上传到指定的存储桶和对象名,并返回生成的URL。
// @param bucketName: 存储桶名称
// @param objectName: 对象名称
// @param fileHeader: 文件头信息
// @return string, error 返回上传成功的URL,可能出现的错误
func UploadFile(bucketName string, objectName string, fileHeader *multipart.FileHeader) (string, error) {
file, err := fileHeader.Open()
defer file.Close()
// 检查存储桶是否存在,如果不存在则创建
flag, err := checkBucket(bucketName)
if !flag {
fmt.Println(err)
return "", err
}
// 保存的文件名
fileName := buildFileName(objectName)
// 将文件上传到指定的存储桶和对象名
_, err = client.PutObject(context.Background(), bucketName, fileName, file, fileHeader.Size, minio.PutObjectOptions{ContentType: "application/octet-stream"})
if err != nil {
fmt.Println(err)
return "", err
}
// 返回生成的URL
return urlPrefix + bucketName + "/" + fileName, nil
}

调用minioUtil

1
2
3
4
5
6
7
8
func UploadFile(c *gin.Context)  {
file, _ := c.FormFile("file")
path, err := minioUtil.UploadFile("test",file.Filename,file)
if err != nil {
return
}
fmt.Println(path)
}