minio.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package utils
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "github.com/minio/minio-go/v7"
  7. "github.com/minio/minio-go/v7/pkg/credentials"
  8. "log"
  9. "path"
  10. "sync"
  11. )
  12. var defaultFileBucket = "file"
  13. var defaultIconBucket = "icon"
  14. var defaultLocation = "us-east-1"
  15. var minioServerPool *sync.Pool
  16. var defaultConfig = &MinioConfig{
  17. EndPoint: "http://114.116.19.14:9000",
  18. AccessKey: "root",
  19. SecretKey: "Houyaf1!",
  20. UseSSL: false,
  21. }
  22. // DestFile 文件
  23. type DestFile struct {
  24. FileName string
  25. FileUrl string
  26. FileSize int64
  27. FileExt string
  28. FileMimeType string
  29. }
  30. func init() {
  31. minioServerPool = &sync.Pool{
  32. New: func() interface{} {
  33. return &MinioServe{}
  34. },
  35. }
  36. }
  37. type MinioFileObject struct {
  38. ObjectName string
  39. FilePath string
  40. ContentType string
  41. }
  42. type MinioConfig struct {
  43. EndPoint string `json:"endPoint"`
  44. AccessKey string `json:"accessKey"`
  45. SecretKey string `json:"secretKey"`
  46. UseSSL bool `json:"useSSL"`
  47. }
  48. func (c *MinioConfig) validate() error {
  49. if c.EndPoint == "" {
  50. return errors.New("EndPoint host not specified")
  51. }
  52. if c.AccessKey == "" {
  53. return errors.New("minio access key is not specified")
  54. }
  55. if c.SecretKey == "" {
  56. return errors.New("minio secret key is not specified")
  57. }
  58. return nil
  59. }
  60. func (c *MinioConfig) getClient() (*minio.Client, error) {
  61. if err := c.validate(); err != nil {
  62. return nil, err
  63. }
  64. minioClient, err := minio.New(
  65. c.EndPoint,
  66. &minio.Options{
  67. Creds: credentials.NewStaticV4(c.AccessKey, c.SecretKey, ""),
  68. Secure: c.UseSSL,
  69. })
  70. if err != nil {
  71. log.Fatalf("connect minio server fail %s url %s", err.Error(), c.EndPoint)
  72. }
  73. return minioClient, nil
  74. }
  75. type MinioServerOption func(*MinioServe)
  76. type MinioServe struct {
  77. Client *minio.Client
  78. }
  79. func NewMinioServer(opts ...MinioServerOption) (*MinioServe, error) {
  80. m := &MinioServe{}
  81. for _, opt := range opts {
  82. opt(m)
  83. }
  84. return m, nil
  85. }
  86. func (m *MinioServe) Reset() {
  87. m.Client = nil
  88. }
  89. func (m *MinioServe) checkBucket(ctx context.Context, bucketName string) bool {
  90. isExist, err1 := m.Client.BucketExists(ctx, bucketName)
  91. if err1 != nil {
  92. log.Fatalf("checkBucket error " + err1.Error())
  93. return false
  94. }
  95. if !isExist {
  96. err2 := m.Client.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{Region: defaultLocation})
  97. if err2 != nil {
  98. log.Fatalf("checkBucket error " + err2.Error())
  99. return false
  100. }
  101. }
  102. return true
  103. }
  104. func (m *MinioServe) checkBuckets(ctx context.Context) bool {
  105. b1 := m.checkBucket(ctx, defaultFileBucket)
  106. b2 := m.checkBucket(ctx, defaultIconBucket)
  107. return b1 && b2
  108. }
  109. func (m *MinioServe) uploadFile(objectName, filePath string) (*DestFile, error) {
  110. ctx := context.Background()
  111. bBucketExist := m.checkBuckets(ctx)
  112. if !bBucketExist {
  113. return nil, errors.New("Bucket不存在")
  114. }
  115. contentType := "application/octet-stream"
  116. uinfo, err := m.Client.FPutObject(ctx, defaultFileBucket, objectName, filePath, minio.PutObjectOptions{
  117. ContentType: contentType,
  118. })
  119. if err != nil {
  120. return nil, err
  121. }
  122. fileExt := path.Ext(objectName)
  123. url := fmt.Sprintf("%s/%s/%s", defaultConfig.EndPoint, defaultFileBucket, objectName)
  124. targetFile := &DestFile{
  125. FileName: objectName,
  126. FileUrl: url,
  127. FileSize: uinfo.Size,
  128. FileExt: fileExt,
  129. FileMimeType: "",
  130. }
  131. return targetFile, nil
  132. }
  133. func acquireMinioServer() *MinioServe {
  134. return minioServerPool.Get().(*MinioServe)
  135. }
  136. func releaseMinioServer(m *MinioServe) {
  137. m.Reset()
  138. minioServerPool.Put(m)
  139. }
  140. func UploadFileToMinio(fileName, filePath string) (*DestFile, error) {
  141. m := acquireMinioServer()
  142. client, err := defaultConfig.getClient()
  143. if err != nil {
  144. return nil, err
  145. }
  146. defer func() {
  147. releaseMinioServer(m)
  148. }()
  149. m.Client = client
  150. objName := ""
  151. return m.uploadFile(objName, filePath)
  152. }