Files
bl/contrib/files/minio/minio.go
2025-06-20 17:13:51 +08:00

131 lines
2.9 KiB
Go

package minio
import (
"context"
"fmt"
"github.com/cool-team-official/cool-admin-go/cool"
"github.com/cool-team-official/cool-admin-go/cool/coolfile"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/util/grand"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
var (
ctx g.Ctx
minioDriverObj = New()
)
type Minio struct {
Client *minio.Client
BucketName string
}
func (m *Minio) New() coolfile.Driver {
g.Log().Debug(ctx, m, m.BucketName)
return m
}
func (m *Minio) GetMode() (data interface{}, err error) {
data = g.MapStrStr{
"mode": "local",
"type": "minio",
}
return
}
func (m *Minio) Upload(ctx g.Ctx) (string, error) {
g.Log().Debug(ctx, m)
var (
err error
Request = g.RequestFromCtx(ctx)
)
file := Request.GetUploadFile("file")
if file == nil {
return "", gerror.New("上传文件为空")
}
src, err := file.Open()
if err != nil {
g.Log().Error(ctx, "文件打开失败")
}
defer src.Close()
// 以当前年月日为目录
dir := gtime.Now().Format("Ymd")
fileName := Request.Get("key", grand.S(16, false)).String()
fullPath := fmt.Sprintf("uploads/%s/%s", dir, fileName)
g.Log().Debug(ctx, fullPath)
// 创建目录
info, err := m.Client.PutObject(ctx, m.BucketName, fullPath, src, -1, minio.PutObjectOptions{})
g.Log().Debug(ctx, info)
if err != nil {
return "上传失败", err
}
return info.Location, nil
}
func New() coolfile.Driver {
ctx := context.Background()
if cool.Config.File.Mode != "minio" {
return nil
}
endpoint := cool.Config.File.Oss.Endpoint
accessKeyID := cool.Config.File.Oss.AccessKeyID
secretAccessKey := cool.Config.File.Oss.SecretAccessKey
useSSL := cool.Config.File.Oss.UseSSL
bucketName := cool.Config.File.Oss.BucketName
location := cool.Config.File.Oss.Location
// Initialize minio client object.
client, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
Secure: useSSL,
})
if err != nil {
g.Log().Error(ctx, "初始化Minio失败")
return nil
}
if client.IsOffline() {
g.Log().Error(ctx, "Minio当前不在线")
return nil
}
err = client.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{Region: location})
if err != nil {
exists, errBucketExists := client.BucketExists(ctx, bucketName)
if errBucketExists == nil && exists {
g.Log().Debug(ctx, fmt.Sprintf("存储桶%s已存在", bucketName))
} else {
g.Log().Fatal(ctx, err)
return nil
}
} else {
g.Log().Info(ctx, fmt.Sprintf("存储桶%s创建成功", bucketName))
}
return &Minio{Client: client, BucketName: bucketName}
}
func init() {
var (
err error
driverNames = g.SliceStr{"minio"}
)
if err != nil {
g.Log().Fatal(ctx, err)
}
for _, driverName := range driverNames {
if err = coolfile.Register(driverName, minioDriverObj); err != nil {
panic(err)
}
}
}