golang gin整合minio文件上传并返回url
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
}
其他文章