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 }