BOYYANG/1/blog/原神女孩子八重神子狐耳4K壁纸_彼岸图网

对象存储Minio使用时的坑(Go)

作者: boyyang
分类: 后端开发
发布: 2024-07-06 05:17:10
更新: 2025-03-31 06:02:14
浏览: 266

       腾讯云的对象存储按量收费,资源越来越多的时候隔一段时间就要充钱,所以想着自己搭建一个对象存储,唯一的坏处那就是速度相比腾讯的对象存储那差太多了。

       在使用docker搭建与使用的时候遇到了很多坑。有些坑现在也没有解决.......

docker搭建Minio:

  1. 拉取镜像
docker pull minio/minio

2. 启动镜像并挂载

docker run \
  -p 9000:9000 \
  -p 9001:9001 \
  --name minio \
  -d --restart=always \
  -e "MINIO_ROOT_USER=admin" \
  -e "MINIO_ROOT_PASSWORD=admin123456" \
  -v /www/wwwroot/minio/data:/data \
  -v /www/wwwroot/minio/config:/root/.minio \
  minio/minio server /data --console-address ":9001"

3. 访问9001端口便能访问页面

在go语言中使用

1. 安装库

go get -u github.com/minio/minio-go

2. 连接minio

package helper

import "github.com/minio/minio-go"

func Minio(endpoint string, accessKey string, secretAccessKey string, secure bool) (minioClient *minio.Client, err error) {
	minioClient, err = minio.New(
		endpoint,
		accessKey,
		secretAccessKey,
		secure,
	)

	if err != nil {
		return nil, err
	}

	return minioClient, nil
}

endpoint: 线上部署的地址(这儿有个坑,就是不要加http直接ip+端口)

accessKey: 登陆minio面板生成accessKey和secretAccessKey

secretAccessKey: 和accessKey一起生成的

secure:是否开启https,根据项目决定

3. 至于存储桶的创建/删除可以直接看官方的相关文档,也可以直接登陆面板手动创建

4. 文件上传

package helper

import (
	"fmt"
	"github.com/minio/minio-go"
	"mime/multipart"
)

type MinioFileUploadParams struct {
	MinioClient   *minio.Client
	FileHeader    *multipart.FileHeader
	Path          string
	ContentLength int64
}

func MinioFileUpload(params *MinioFileUploadParams) (url string, err error) {

	cloudPath := fmt.Sprintf("%s/%s", params.Path, params.FileHeader.Filename)
	f, _ := params.FileHeader.Open()
	defer func(f multipart.File) {
		err := f.Close()
		if err != nil {

		}
	}(f)

	_, err = params.MinioClient.PutObject(
		"boyyang",
		cloudPath,
		f,
		params.FileHeader.Size,
		minio.PutObjectOptions{},
	)

	if err == nil {
		return cloudPath, nil
	} else {
		return "", err
	}
}

 使用minio.Client的PutObject,参数列表(bucketName string, objectName string, reader io.Reader, objectSize int64, opts PutObjectOption)

 bucketName: 存储桶名称

 objectName: 就是你文件上传路径

 reader: 文件reader

 objectSize: 文件大小(这儿我遇到一个坑,还不知道怎么解决,在我上传某一个图片时,

      报错:You did not  provide the number of bytes specified by the Content-Length HTTP  header)我猜测可能objeceSize和我通过FileHeader.Size获取到的值不一致导致的,我试了一些方法好像都没有用。

opts: 其它的一些配置(还没有研究)


#go
#docker
#对象存储
#minio