oss_client.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package utils
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  6. "github.com/minio/minio-go/v7"
  7. "github.com/minio/minio-go/v7/pkg/credentials"
  8. "sync"
  9. "time"
  10. )
  11. type OssClient interface {
  12. UploadFile(fileName, localFile, savePath string) (resourceUrl string, err error)
  13. Instance() OssClient
  14. }
  15. const (
  16. MINIO = "minio"
  17. ALIYUN = "aliyun"
  18. )
  19. var (
  20. ossClientMap = map[string]OssClient{
  21. MINIO: &MinioOssService{},
  22. ALIYUN: &AliyunService{},
  23. }
  24. )
  25. type MinioOssService struct {
  26. client *minio.Client
  27. }
  28. type AliyunService struct {
  29. client *oss.Client
  30. }
  31. var (
  32. minioOnce sync.Once
  33. aliyunOnce sync.Once
  34. MinioClient *MinioOssService
  35. AliyunClient *AliyunService
  36. )
  37. func OssClientHandler(name string) (client OssClient, err error) {
  38. if _, ok := ossClientMap[name]; !ok {
  39. err = fmt.Errorf("不支持的oss类型:[ %s]", name)
  40. return
  41. }
  42. client = ossClientMap[name].Instance()
  43. return
  44. }
  45. // UploadFile 上传文件
  46. func (m *MinioOssService) UploadFile(fileName, filePath, savePath string) (resourceUrl string, err error) {
  47. bucketName := MinIoBucketName
  48. exists, errBucketExists := m.client.BucketExists(context.Background(), bucketName)
  49. if errBucketExists != nil || !exists {
  50. err = fmt.Errorf("BucketExists: %v; err: %v", exists, errBucketExists)
  51. FileLog.Error("BucketExists: %v; err: %v", exists, errBucketExists)
  52. return
  53. }
  54. path := fmt.Sprintf("%s%s%s/%s", MinIoUploadDir, time.Now().Format("200601/20060102/"), savePath, fileName)
  55. _, err = m.client.FPutObject(context.Background(), bucketName, path, filePath, minio.PutObjectOptions{})
  56. if err != nil {
  57. FileLog.Error("MinIo上传文件失败:", err)
  58. return
  59. }
  60. resourceUrl = MinIoViewHost + path
  61. return
  62. }
  63. func (m *MinioOssService) Instance() OssClient {
  64. if MinioClient == nil {
  65. minioOnce.Do(func() {
  66. if MinIoAccessKeyId == `` || MinIoAccessKeySecret == `` {
  67. FileLog.Warn("MinIo信息未配置,实例化客户端失败")
  68. return
  69. }
  70. endpoint := MinIoEndpoint
  71. accessKeyID := MinIoAccessKeyId
  72. secretAccessKey := MinIoAccessKeySecret
  73. useSSL := false
  74. if MinIoUseSSL == "true" {
  75. useSSL = true
  76. }
  77. client, err := minio.New(endpoint, &minio.Options{
  78. Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
  79. Secure: useSSL,
  80. })
  81. if err != nil {
  82. FileLog.Error("MinIo连接失败:", err)
  83. return
  84. }
  85. MinioClient = &MinioOssService{
  86. client: client,
  87. }
  88. })
  89. }
  90. return MinioClient
  91. }