Golang使用gin框架上传文件到MinIO

  • Post author:
  • Post category:golang




一、环境介绍

Go版本:1.13.1

开发工具:IntelliJ IDEA 2019.2.3 x64

开发环境:windows10 64位



二、开始coding



1、前端页面代码

注意name=”datasetPath[]

    <label>选择文件</label>
    <input type="file" id="datasetPath" name="datasetPath[]" multiple />
    <input type="submit" name="提交">
</form>



2、gin代码

func Uploadfile(c *gin.Context,dsId string)([]string, error){
	form,_ := c.MultipartForm()
	files := form.File["datasetPath[]"]
	//var filePathMinio []string
	// 切片类型(slice),默认长度为1,最大容量为20
	filePathMinio := make([]string, 1, 20)
	i := 0
	for _,file := range files {
		log.Println("upload file path: %s",file.Filename)
		objectName := time.Now().Format("20060102") + "/" + dsId + "/" + file.Filename
		err := util.UploadToMinio(objectName,file,"")
		if err != nil{
			return nil,errors.New("Failed upload file")
		}
		filePathMinio[i] = "http://" + _const.MINIO_ENDPOINT + "/" + _const.MINIO_BUCKETNAME + "/" + objectName
		i = i + 1
	}
    return filePathMinio,nil
}



3、上传minio代码

入参objectName:文件在bucket上的路径,带文件名称

入参file:gin上下文获取到的文件列表中的一个文件

入参contentType:minio上传文件方式,可以为空

func UploadToMinio(objectName string,file *multipart.FileHeader,contentType string) error {
	// 初使化 minio client对象
	minioClient, err := minio.New(_const.MINIO_ENDPOINT, _const.MINIO_ACCESSKEYID, _const.MINIO_SECRETACCESSKEY, _const.MINIO_USESSL)
	if err != nil {
		return err
	}

	// 创建一个叫xxxx的存储桶
	err = minioClient.MakeBucket(_const.MINIO_BUCKETNAME, _const.MINIO_LOCATION)
	if err != nil {
		// 检查存储桶是否已经存在。
		exists, err := minioClient.BucketExists(_const.MINIO_BUCKETNAME)
		if err == nil && exists {
			log.Printf("Bucket:%s is already exist\n", _const.MINIO_BUCKETNAME)
		} else {
			return err
		}
	}
	log.Printf("Successfully created bucket: %s\n", _const.MINIO_BUCKETNAME)

	src, err1 := file.Open()
	if err1 != nil {
		return err1
	}
	defer src.Close()

	// 使用PutObject上传一个zip文件
	_, err2 := minioClient.PutObject(_const.MINIO_BUCKETNAME, objectName, src,-1, minio.PutObjectOptions{ContentType:contentType})
	if err2 != nil {
		return err2
	}

    return nil
}

这里使用minioClient.PutObject()方法上传,入参是file.Open()。

如果使用FPutObject()方法上传,入参就是文件路径。

可以在下面的地址找到API指导

https://docs.min.io/cn/golang-client-api-reference.html

在这里插入图片描述



版权声明:本文为reachyu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。