minio.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package minio
  2. import (
  3. "context"
  4. "fmt"
  5. "fwh-toolbox-server/config"
  6. "io"
  7. "log"
  8. "net/url"
  9. "strings"
  10. "time"
  11. "github.com/minio/minio-go/v7"
  12. "github.com/minio/minio-go/v7/pkg/credentials"
  13. "go.uber.org/zap"
  14. )
  15. var Client *minio.Client
  16. var BucketName string
  17. type ObjectInfo = minio.ObjectInfo
  18. func InitClient(cfg *config.Config) {
  19. var err error
  20. Client, err = minio.New(cfg.MinIoEndpoint, &minio.Options{
  21. Creds: credentials.NewStaticV4(cfg.MinioAccessKey, cfg.MinioSecretKey, ""),
  22. Secure: strings.HasPrefix(strings.ToLower(cfg.MinIoEndpoint), "https://"),
  23. })
  24. if err != nil {
  25. log.Fatalln("❌ Failed to init MinIO client")
  26. panic(err)
  27. }
  28. BucketName = cfg.MinioBucketName
  29. ctx := context.Background()
  30. bucketInfo, err := Client.ListBuckets(ctx)
  31. if err != nil {
  32. log.Fatalln("❌ List Buckets failed")
  33. panic(err)
  34. }
  35. log.Println("Exists Bucket:")
  36. for _, info := range bucketInfo {
  37. log.Printf("%s\n", info.Name)
  38. }
  39. exists, err := Client.BucketExists(ctx, BucketName)
  40. if err != nil {
  41. log.Fatalf("❌ Bucket check failed: %s\n", BucketName)
  42. panic(err)
  43. }
  44. if !exists {
  45. err = Client.MakeBucket(ctx, BucketName, minio.MakeBucketOptions{})
  46. if err != nil {
  47. log.Fatalln("❌ Failed to create bucket")
  48. panic(err)
  49. }
  50. log.Println("✅ Created bucket:", BucketName)
  51. } else {
  52. log.Println("✅ Using existing bucket:", BucketName)
  53. }
  54. }
  55. func UploadFile(localPath, objectName string) error {
  56. ctx := context.Background()
  57. info, err := Client.FPutObject(ctx, BucketName, objectName, localPath, minio.PutObjectOptions{})
  58. if err != nil {
  59. return err
  60. }
  61. zap.L().Info(fmt.Sprintf("✅ Uploaded %s (%d bytes)", info.Key, info.Size))
  62. return nil
  63. }
  64. func DownloadFile(objectName, localPath string) error {
  65. ctx := context.Background()
  66. return Client.FGetObject(ctx, BucketName, objectName, localPath, minio.GetObjectOptions{})
  67. }
  68. func ListPathOrFiles(prefix string, recursive bool) ([]string, error) {
  69. ctx := context.Background()
  70. var result []string
  71. for obj := range Client.ListObjects(ctx, BucketName, minio.ListObjectsOptions{
  72. Prefix: prefix, // 遍历 prefix 目录
  73. Recursive: recursive, // true - 递归所有文件, false - 只列出当前层级
  74. }) {
  75. if obj.Err != nil {
  76. return nil, obj.Err
  77. }
  78. result = append(result, obj.Key)
  79. }
  80. return result, nil
  81. }
  82. func ListAllFiles() ([]string, error) {
  83. ctx := context.Background()
  84. var result []string
  85. for obj := range Client.ListObjects(ctx, BucketName, minio.ListObjectsOptions{Recursive: true}) {
  86. if obj.Err != nil {
  87. return nil, obj.Err
  88. }
  89. result = append(result, obj.Key)
  90. }
  91. return result, nil
  92. }
  93. func DeleteFile(objectName string) error {
  94. ctx := context.Background()
  95. return Client.RemoveObject(ctx, BucketName, objectName, minio.RemoveObjectOptions{})
  96. }
  97. func GetObject(objectName string) (*minio.Object, error) {
  98. ctx := context.Background()
  99. return Client.GetObject(ctx, BucketName, objectName, minio.GetObjectOptions{})
  100. }
  101. // StatObject 会验证对象是否存在,您是否拥有访问该对象的权限,并返回有关该对象的信息。
  102. func StatObject(objectName string) (minio.ObjectInfo, error) {
  103. ctx := context.Background()
  104. return Client.StatObject(ctx, BucketName, objectName, minio.StatObjectOptions{})
  105. }
  106. // 生成临时下载链接
  107. func GetPresignedURL(objectName string, expire time.Duration) (*url.URL, error) {
  108. ctx := context.Background()
  109. return Client.PresignedGetObject(ctx, BucketName, objectName, expire, nil)
  110. }
  111. // 从流上传(用于HTTP上传)
  112. func UploadFromReader(file io.Reader, size int64, objectName, contentType string) error {
  113. ctx := context.Background()
  114. info, err := Client.PutObject(ctx, BucketName, objectName, file, size, minio.PutObjectOptions{
  115. ContentType: contentType,
  116. })
  117. if err != nil {
  118. return err
  119. }
  120. zap.L().Info(fmt.Sprintf("✅ Uploaded %s (%d bytes)", info.Key, info.Size))
  121. return nil
  122. }
  123. // 判断文件是否存在
  124. func ExistsObject(objectName string) (bool, error) {
  125. _, err := StatObject(objectName)
  126. if err != nil {
  127. // 对象不存在的判断(最常见)
  128. if minio.ToErrorResponse(err).Code == "NoSuchKey" {
  129. log.Printf("Object(%s) does NOT exist\n", objectName)
  130. return false, nil
  131. }
  132. return false, err
  133. }
  134. return true, nil
  135. }