minio 配置

{
  "minio_endpoint": "play.min.io",  // minio 地址 
  "minio_access_key_id": "Q3AM3UQ867SPQQA43P2F", // id 
  "minio_secret_access_key": "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG", //key 
  "minio_bucket":"hot-recommend-test", 
  "minio_location": "cn-north-1" // 存储桶被创建的region(地区),默认是us-east-1(美国东一区) 具体详情请移步官方文档 https://docs.min.io/cn/golang-client-api-reference.html
} 

具体代码

package main

import (
	"context"
	"fmt"
	"github.com/gin-gonic/gin"
	_ "github.com/gin-gonic/gin/binding"
	"github.com/go-basic/uuid"
	"github.com/minio/minio-go/v7"
	"github.com/minio/minio-go/v7/pkg/credentials"
	"goMinioDemo/tool"
	"log"
	"mime/multipart"
)
import _ "github.com/gin-gonic/gin"

func main()  {
	cfg,err := tool.ParseConfig("./config/app.json")
	if err!=nil {
		panic(err.Error())
	}
	app:=gin.Default()

	app.POST("/uploadFile", func(context *gin.Context) {
		// 文件上传接口
		file,err :=context.FormFile("file")
		if err!=nil {
			fmt.Println("文件读取失败!"+err.Error())
			context.JSON(500,map[string]interface{}{
				"code":500,
				"msg":"文件读取失败!",
				"data":nil,
			})
			return
		}
        // fileName 前置 “img/” 可在桶中创建一个文件夹,方便后期文件分类,如不加直接上传至桶 "/"目录下
		fileName:= "img/"+uuid.New()+file.Filename
		err = UploadToMinio(fileName,file,"",cfg)
		if err!=nil {
			fmt.Println(err.Error())
			context.JSON(500,map[string]interface{}{
				"code":500,
				"msg":"文件上传失败!",
				"data":err.Error(),
			})
		}
		context.JSON(200,map[string]interface{}{
			"code":200,
			"msg":"文件上传成功!",
			"data":"http://"+cfg.MinioEndpoint+"/"+cfg.MinioBucket+"/"+fileName,
		})
	})

	app.Run(cfg.AppHost+":"+cfg.AppPort)

}


func UploadToMinio(objectName string,file *multipart.FileHeader,contentType string,cfg *tool.Config) error {
	// 初使化 minio client对象
	ctx := context.Background()
	minioClient, err := minio.New(cfg.MinioEndpoint, &minio.Options{
		Creds:  credentials.NewStaticV4(cfg.MinioAccessKeyId, cfg.MinioSecretAccessKey, ""),
		Secure: false, // 如果使用 ssl 请设置为true
	})
	if err != nil {
		return err
	}
	// 创建一个叫xxxx的存储桶
	err = minioClient.MakeBucket(ctx,cfg.MinioBucket,minio.MakeBucketOptions{Region: cfg.MinioLocation})

	if err != nil {
		// 检查存储桶是否已经存在。
		exists, err := minioClient.BucketExists(ctx,cfg.MinioBucket)
		if err == nil && exists {
			log.Printf("Bucket:%s 已存在 \n", cfg.MinioBucket)
		} else {
			return err
		}
	}
	log.Printf("成功创建 bucket: %s\n", cfg.MinioBucket)
	/*p,_:=minioClient.GetBucketPolicy(ctx,cfg.MinioBucket)
	log.Println("权限:"+p)*/
	// 给创建的桶设置读写权限 如果不设置读写权限返回的url 将无法直接下载或在html中显示
    // json 数据由GetBucketPolicy读取而来,只需要替换 cfg.MinioBucket 即可
	policy := "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:ListBucketMultipartUploads\",\"s3:GetBucketLocation\",\"s3:ListBucket\"],\"Resource\":[\"arn:aws:s3:::"+cfg.MinioBucket+"\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:AbortMultipartUpload\",\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\",\"s3:PutObject\"],\"Resource\":[\"arn:aws:s3:::"+cfg.MinioBucket+"/*\"]}]}\n"
	err = minioClient.SetBucketPolicy(ctx,cfg.MinioBucket, policy)
	if err!=nil {
		log.Printf("Bucket: %s 权限设置失败\n",cfg.MinioBucket)
		log.Println(err.Error())
	}
	src, err1 := file.Open()
	if err1 != nil {
		return err1
	}
	defer src.Close()
	// 使用PutObject上传一个文件
	_, err2 := minioClient.PutObject(ctx,cfg.MinioBucket, objectName, src,-1, minio.PutObjectOptions{ContentType:contentType})
	if err2 != nil {
		return err2
	}
	return nil
}