minio.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package utils
  2. import (
  3. "context"
  4. "github.com/minio/minio-go/v7"
  5. "github.com/minio/minio-go/v7/pkg/credentials"
  6. "sync"
  7. "time"
  8. )
  9. const (
  10. DefaultExpiredTime = 30 * time.Minute
  11. )
  12. var (
  13. once sync.Once
  14. minioClient *MinioOss
  15. )
  16. type MinioOss struct {
  17. bucketName string
  18. ObjectName string
  19. minioClient *minio.Client
  20. ExpiredTime time.Duration
  21. }
  22. func (mo *MinioOss) oss() *minio.Client {
  23. return mo.minioClient
  24. }
  25. func (mo *MinioOss) GetObject(objectName string, filePath string) (err error) {
  26. err = minioClient.oss().FGetObject(context.Background(), mo.GetBucketName(), objectName, filePath, minio.GetObjectOptions{})
  27. return
  28. }
  29. func (mo *MinioOss) SaveObject(objectName string, filePath string) (err error) {
  30. _, err = minioClient.oss().FPutObject(context.Background(), mo.GetBucketName(), objectName, filePath, minio.PutObjectOptions{})
  31. return
  32. }
  33. func (mo *MinioOss) GetState(objectName string) (state minio.ObjectInfo, err error) {
  34. state, err = minioClient.oss().StatObject(context.Background(), mo.GetBucketName(), objectName, minio.GetObjectOptions{})
  35. return
  36. }
  37. func (mo *MinioOss) GetObjectExt(contentType string) (ext string) {
  38. return getFileExtensionFromContentType(contentType)
  39. }
  40. func getFileExtensionFromContentType(contentType string) string {
  41. switch contentType {
  42. case "image/jpeg":
  43. return ".jpg"
  44. case "image/png":
  45. return ".png"
  46. case "application/pdf":
  47. return ".pdf"
  48. case "application/msword":
  49. return ".doc"
  50. case "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
  51. return ".docx"
  52. case "application/vnd.ms-excel":
  53. return ".xls"
  54. case "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":
  55. return ".xlsx"
  56. case "text/plain":
  57. return ".txt"
  58. case "application/json":
  59. return ".json"
  60. case "application/octet-stream":
  61. return ".bin"
  62. default:
  63. return ""
  64. }
  65. }
  66. func DefaultClient() *MinioOss {
  67. once.Do(func() {
  68. if minioClient == nil {
  69. // 此处兼容一下前后端endpoint不一致的情况, 前端用minio_endpoint后端用minio_back_endpoint, minio_back_endpoint为空则都取前者
  70. endpoint := MinIoEndpoint
  71. if MinIoBackEndpoint != "" {
  72. endpoint = MinIoBackEndpoint
  73. }
  74. accessKeyID := MinIoAccessKeyId
  75. secretAccessKey := MinIoAccessKeySecret
  76. useSSL := false
  77. if MinIoUseSSL == "true" {
  78. useSSL = true
  79. }
  80. client, err := minio.New(endpoint, &minio.Options{
  81. Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
  82. Secure: useSSL,
  83. })
  84. if err != nil {
  85. FileLog.Error("初始化minio客户端失败: %s", err)
  86. }
  87. bucketName := MinIoBucketname
  88. exists, errBucketExists := client.BucketExists(context.Background(), bucketName)
  89. if errBucketExists != nil || !exists {
  90. FileLog.Error("BucketExists: %v; err: %v", exists, errBucketExists)
  91. }
  92. minioClient = &MinioOss{
  93. minioClient: client,
  94. bucketName: bucketName,
  95. ExpiredTime: DefaultExpiredTime,
  96. }
  97. }
  98. })
  99. return minioClient
  100. }
  101. func (mo *MinioOss) GetBucketName() string {
  102. return mo.bucketName
  103. }
  104. func (mo *MinioOss) GetExpiredTime() time.Duration {
  105. return mo.ExpiredTime
  106. }
  107. // 生成预签名的PUT URL
  108. func (mo *MinioOss) GeneratePreSignedPutURLHandler(objectName string) (url string, err error) {
  109. // 生成预签名的PUT URL
  110. PreSignedURL, err := minioClient.oss().PresignedPutObject(context.Background(), minioClient.GetBucketName(), objectName, minioClient.GetExpiredTime())
  111. if err != nil {
  112. FileLog.Error("生成预签名的PUT URL失败: %s", err)
  113. return
  114. }
  115. url = PreSignedURL.String()
  116. return
  117. }