minio.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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. func InitClient(cfg *config.Config) {
  18. var err error
  19. Client, err = minio.New(cfg.MinIoEndpoint, &minio.Options{
  20. Creds: credentials.NewStaticV4(cfg.MinioAccessKey, cfg.MinioSecretKey, ""),
  21. Secure: strings.HasPrefix(strings.ToLower(cfg.MinIoEndpoint), "https://"),
  22. })
  23. if err != nil {
  24. log.Fatalln("❌ Failed to init MinIO client")
  25. panic(err)
  26. }
  27. BucketName = cfg.MinioBucketName
  28. ctx := context.Background()
  29. bucketInfo, err := Client.ListBuckets(ctx)
  30. if err != nil {
  31. log.Fatalln("❌ List Buckets failed")
  32. panic(err)
  33. }
  34. log.Println("Exists Bucket:")
  35. for _, info := range bucketInfo {
  36. log.Printf("%s\n", info.Name)
  37. }
  38. exists, err := Client.BucketExists(ctx, BucketName)
  39. if err != nil {
  40. log.Fatalf("❌ Bucket check failed: %s\n", BucketName)
  41. panic(err)
  42. }
  43. if !exists {
  44. err = Client.MakeBucket(ctx, BucketName, minio.MakeBucketOptions{})
  45. if err != nil {
  46. log.Fatalln("❌ Failed to create bucket")
  47. panic(err)
  48. }
  49. log.Println("✅ Created bucket:", BucketName)
  50. } else {
  51. log.Println("✅ Using existing bucket:", BucketName)
  52. }
  53. }
  54. func UploadFile(localPath, objectName string) error {
  55. ctx := context.Background()
  56. info, err := Client.FPutObject(ctx, BucketName, objectName, localPath, minio.PutObjectOptions{})
  57. if err != nil {
  58. return err
  59. }
  60. zap.L().Info(fmt.Sprintf("✅ Uploaded %s (%d bytes)", info.Key, info.Size))
  61. return nil
  62. }
  63. func DownloadFile(objectName, localPath string) error {
  64. ctx := context.Background()
  65. return Client.FGetObject(ctx, BucketName, objectName, localPath, minio.GetObjectOptions{})
  66. }
  67. func ListFiles() ([]string, error) {
  68. ctx := context.Background()
  69. var result []string
  70. for obj := range Client.ListObjects(ctx, BucketName, minio.ListObjectsOptions{Recursive: true}) {
  71. if obj.Err != nil {
  72. return nil, obj.Err
  73. }
  74. result = append(result, obj.Key)
  75. }
  76. return result, nil
  77. }
  78. func DeleteFile(objectName string) error {
  79. ctx := context.Background()
  80. return Client.RemoveObject(ctx, BucketName, objectName, minio.RemoveObjectOptions{})
  81. }
  82. func GetObject(objectName string) (*minio.Object, error) {
  83. ctx := context.Background()
  84. return Client.GetObject(ctx, BucketName, objectName, minio.GetObjectOptions{})
  85. }
  86. // 生成临时下载链接
  87. func GetPresignedURL(objectName string, expire time.Duration) (*url.URL, error) {
  88. ctx := context.Background()
  89. return Client.PresignedGetObject(ctx, BucketName, objectName, expire, nil)
  90. }
  91. // 从流上传(用于HTTP上传)
  92. func UploadFromReader(file io.Reader, size int64, objectName, contentType string) error {
  93. ctx := context.Background()
  94. info, err := Client.PutObject(ctx, BucketName, objectName, file, size, minio.PutObjectOptions{
  95. ContentType: contentType,
  96. })
  97. if err != nil {
  98. return err
  99. }
  100. zap.L().Info(fmt.Sprintf("✅ Uploaded %s (%d bytes)", info.Key, info.Size))
  101. return nil
  102. }