minio golangAPI使用| 青训营笔记

823 阅读3分钟

minio golangAPI使用| 青训营笔记

这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记

在项目实现的过程中需要将播放视频的url传递给前端,考虑使用oss存储生成对外访问的url。

由于没钱购买阿里云对象存储服务,考虑使用minio部署在本地来提供对象存储的功能。

image.png

下载安装minio

linux

$ wget https://dl.min.io/server/minio/release/linux-amd64/minio
$ chmod +x minio
$ ./minio server ./data    #启动minio

可以看到以下输出

API表示对外提供的URL地址,Console是minio提供的一个web页面。

golang package下载

$ go get -u github.com/minio/minio-go

Golang Client

初始化MinIO Client

MinIO client需要以下4个参数来连接与Amazon S3兼容的对象存储。

参数描述
endpoint对象存储服务的URL
accessKeyIDAccess key是唯一标识你的账户的用户ID。
secretAccessKeySecret key是你账户的密码。
securetrue代表使用HTTPS
package main
​
import (
    "github.com/minio/minio-go/v6"
    "log"
)
​
func main() {
    endpoint := "yourendpoint"
    accessKeyID := "minioadmin"
    secretAccessKey := "minioadmin"
    useSSL := false
​
    // 初使化 minio client对象。
    m, err := minio.New(endpoint, accessKeyID, secretAccessKey, useSSL)
    if err != nil {
        fmt.Printf(err.Error())
    }
​
    fmt.Printf("%#v\n", m) // minioClient初使化成功
}

创建存储桶

首先判断桶是否存在

found, err := m.BucketExists(bucketname)//bucketname 桶名称
if err != nil {
    fmt.Printf("check %s bucketExists err:%s", bucketname, err.Error())
}
if found {
    fmt.Printf("exist")
}

然后创建桶

m.MakeBucket(bucket, "cn-north-1 ")

参数

参数类型描述
bucketNamestring存储桶名称
locationstring存储桶被创建的region(地区),默认是us-east-1(美国东一区)

创建完桶后默认的桶策略(Access Policy)是private,这样外部无法通过url访问桶内的视频,需要设置桶的权限。

policy := `{"Version": "2012-10-17",
                "Statement": 
                    [{
                        "Action":["s3:GetObject"],
                        "Effect": "Allow",
                        "Principal": {"AWS": ["*"]},
                        "Resource": ["arn:aws:s3:::bucketname/*"],
                        "Sid": ""
                    }]
                }`
    //action处设置读权限,resource处bucketname为桶的名称
    err = m.SetBucketPolicy(bucket, policy)
    if err != nil {
        log.Errorf("SetBucketPolicy %s  err:%s", bucket, err.Error())
    }

上传文件

FPutObject(bucketName, objectName, filePath, opts PutObjectOptions) (length int64, err error)

  • filePath对应的文件内容上传到一个对象中。
  • 当对象小于128MiB时,FPutObject直接在一次PUT请求里进行上传。当大于128MiB时,根据文件的实际大小,FPutObject会自动地将对象进行拆分成128MiB一块或更大一些进行上传。对象的最大大小是5TB。
n, err := m.FPutObject("bucketname", "objectname", "filename.mp4", minio.PutObjectOptions{
    ContentType: "video/mp4",
});
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println("Successfully uploaded bytes: ", n)

这里ContentType如果文件类型是mp4格式则设定为video/mp4,如果是jpg则是image/jpeg,否则打开链接会直接下载文件而不是播放视频/查看图片。

参数类型描述
bucketNamestring存储桶名称
objectNamestring对象的名称
filePathstring要上传的文件的路径
optsminio.PutObjectOptions允许用户设置可选的自定义元数据,content-type,content-encoding,content-disposition以及cache-control headers,传递加密模块以加密对象,并可选地设置multipart put操作的线程数量。

例如,我设定桶名称为videotest,文件名为test.mp4,上传成功后可在对应data/video下看到上传的文件。通过浏览器console地址也可以看到上传的视频信息

image-20220524202759522

该视频访问的url为http://host:9000/videotest/test.mp4

image-20220524203036198

其中host为本机ip,为了能够让同一局域网下的手机访问不要使用localhost