123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- package utils
- import (
- "context"
- "fmt"
- "github.com/aliyun/aliyun-oss-go-sdk/oss"
- "github.com/minio/minio-go/v7"
- "github.com/minio/minio-go/v7/pkg/credentials"
- "sync"
- "time"
- )
- type OssClient interface {
- UploadFile(fileName, localFile, savePath string) (resourceUrl string, err error)
- Instance() OssClient
- }
- const (
- MINIO = "minio"
- ALIYUN = "aliyun"
- )
- var (
- ossClientMap = map[string]OssClient{
- MINIO: &MinioOssService{},
- ALIYUN: &AliyunService{},
- }
- )
- type MinioOssService struct {
- client *minio.Client
- }
- type AliyunService struct {
- client *oss.Client
- }
- var (
- minioOnce sync.Once
- aliyunOnce sync.Once
- MinioClient *MinioOssService
- AliyunClient *AliyunService
- )
- func OssClientHandler(name string) (client OssClient, err error) {
- if _, ok := ossClientMap[name]; !ok {
- err = fmt.Errorf("不支持的oss类型:[ %s]", name)
- return
- }
- client = ossClientMap[name].Instance()
- return
- }
- // UploadFile 上传文件
- func (m *MinioOssService) UploadFile(fileName, filePath, savePath string) (resourceUrl string, err error) {
- bucketName := MinIoBucketName
- exists, errBucketExists := m.client.BucketExists(context.Background(), bucketName)
- if errBucketExists != nil || !exists {
- err = fmt.Errorf("BucketExists: %v; err: %v", exists, errBucketExists)
- FileLog.Error("BucketExists: %v; err: %v", exists, errBucketExists)
- return
- }
- path := fmt.Sprintf("%s%s%s/%s", MinIoUploadDir, time.Now().Format("200601/20060102/"), savePath, fileName)
- _, err = m.client.FPutObject(context.Background(), bucketName, path, filePath, minio.PutObjectOptions{})
- if err != nil {
- FileLog.Error("MinIo上传文件失败:", err)
- return
- }
- resourceUrl = MinIoViewHost + path
- return
- }
- func (m *MinioOssService) Instance() OssClient {
- if MinioClient == nil {
- minioOnce.Do(func() {
- if MinIoAccessKeyId == `` || MinIoAccessKeySecret == `` {
- FileLog.Warn("MinIo信息未配置,实例化客户端失败")
- return
- }
- endpoint := MinIoEndpoint
- accessKeyID := MinIoAccessKeyId
- secretAccessKey := MinIoAccessKeySecret
- useSSL := false
- if MinIoUseSSL == "true" {
- useSSL = true
- }
- client, err := minio.New(endpoint, &minio.Options{
- Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
- Secure: useSSL,
- })
- if err != nil {
- FileLog.Error("MinIo连接失败:", err)
- return
- }
- MinioClient = &MinioOssService{
- client: client,
- }
- })
- }
- return MinioClient
- }
|