
对象存储Minio使用时的坑(Go)
腾讯云的对象存储按量收费,资源越来越多的时候隔一段时间就要充钱,所以想着自己搭建一个对象存储,唯一的坏处那就是速度相比腾讯的对象存储那差太多了。
在使用docker搭建与使用的时候遇到了很多坑。有些坑现在也没有解决.......
docker搭建Minio:
- 拉取镜像
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: 其它的一些配置(还没有研究)