| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- package three_party
- import (
- "context"
- "errors"
- "fmt"
- "github.com/minio/minio-go/v7"
- "github.com/minio/minio-go/v7/pkg/credentials"
- "log"
- "path"
- "sync"
- )
- var defaultFileBucket = "file"
- var defaultIconBucket = "icon"
- var defaultLocation = "us-east-1"
- var minioServerPool *sync.Pool
- var defaultConfig = &MinioConfig{
- EndPoint: "http://114.116.19.14:9000",
- AccessKey: "root",
- SecretKey: "Houyaf1!",
- UseSSL: false,
- }
- // client version and secret, it should be from client side
- const (
- UploadDir string = "./public/upload/"
- UrlBase string = "/upload/"
- )
- // DestFile 文件
- type DestFile struct {
- FileName string
- FileUrl string
- FileSize int64
- FileExt string
- FileMimeType string
- }
- func init() {
- minioServerPool = &sync.Pool{
- New: func() interface{}{
- return &MinioServe{}
- },
- }
- }
- type MinioFileObject struct {
- ObjectName string
- FilePath string
- ContentType string
- }
- type MinioConfig struct {
- EndPoint string `json:"endPoint"`
- AccessKey string `json:"accessKey"`
- SecretKey string `json:"secretKey"`
- UseSSL bool `json:"useSSL"`
- }
- func (c *MinioConfig) Validate() error {
- if c.EndPoint == "" {
- return errors.New("EndPoint host not specified")
- }
-
- if c.AccessKey == "" {
- return errors.New("minio access key is not specified")
- }
-
- if c.SecretKey == "" {
- return errors.New("minio secret key is not specified")
- }
- return nil
- }
- func (c *MinioConfig) GetClient()(*minio.Client, error) {
- if err := c.Validate(); err != nil {
- return nil, err
- }
-
- minioClient, err := minio.New(
- c.EndPoint,
- &minio.Options{
- Creds: credentials.NewStaticV4(c.AccessKey, c.SecretKey, ""),
- Secure: c.UseSSL,
- })
-
- if err != nil {
- log.Fatalf("connect minio server fail %s url %s", err.Error(), c.EndPoint)
- }
- return minioClient, nil
- }
- type MinioServerOption func(*MinioServe)
- type MinioServe struct {
- Client *minio.Client
- }
- func NewMinioServer(opts ...MinioServerOption)(*MinioServe, error){
- m := &MinioServe{}
- for _, opt := range opts {
- opt(m)
- }
-
- return m, nil
- }
- func (m *MinioServe) Reset() {
- m.Client = nil
- }
- func (m *MinioServe) checkBucket(ctx context.Context, bucketName string) bool {
- isExist, err1 := m.Client.BucketExists(ctx, bucketName)
- if err1 != nil {
- log.Fatalf("checkBucket error " + err1.Error())
- return false
- }
-
- if !isExist {
- err2 := m.Client.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{Region: defaultLocation})
- if err2 != nil {
- log.Fatalf("checkBucket error " + err2.Error())
- return false
- }
- }
- return true
- }
- func (m *MinioServe) CheckBuckets(ctx context.Context) bool {
- b1 := m.checkBucket(ctx, defaultFileBucket)
- b2 := m.checkBucket(ctx, defaultIconBucket)
- return b1&&b2
- }
- func (m *MinioServe) UploadFile(objectName, filePath string)(*DestFile, error) {
- ctx := context.Background()
- bBucketExist := m.CheckBuckets(ctx)
- if !bBucketExist {
- return nil , errors.New("Bucket不存在")
- }
-
- contentType := "application/octet-stream"
- uinfo, err := m.Client.FPutObject(ctx, defaultFileBucket, objectName, filePath, minio.PutObjectOptions{
- ContentType: contentType,
- })
-
- if err != nil {
- return nil, err
- }
-
- fileExt := path.Ext(objectName)
-
- url := fmt.Sprintf("%s/%s/%s", defaultConfig.EndPoint, defaultFileBucket, objectName)
- targetFile := &DestFile{
- FileName: objectName,
- FileUrl: url,
- FileSize: uinfo.Size,
- FileExt: fileExt,
- FileMimeType: "",
- }
-
- return targetFile, nil
- }
- func acquireMinioServer() *MinioServe {
- return minioServerPool.Get().(*MinioServe)
- }
- func releaseMinioServer(m *MinioServe) {
- m.Reset()
- minioServerPool.Put(m)
- }
- func UploadFile(fileName, filePath string) (*DestFile,error){
- m := acquireMinioServer()
-
- client, err := defaultConfig.GetClient()
- if err != nil {
- return nil, err
- }
- defer func() {
- releaseMinioServer(m)
- }()
- m.Client = client
- objName := ""
- return m.UploadFile(objName, filePath)
- }
|