minio golangAPI使用| 青训营笔记
这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
在项目实现的过程中需要将播放视频的url传递给前端,考虑使用oss存储生成对外访问的url。
由于没钱购买阿里云对象存储服务,考虑使用minio部署在本地来提供对象存储的功能。
下载安装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 |
accessKeyID | Access key是唯一标识你的账户的用户ID。 |
secretAccessKey | Secret key是你账户的密码。 |
secure | true代表使用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 ")
参数
| 参数 | 类型 | 描述 |
|---|---|---|
bucketName | string | 存储桶名称 |
location | string | 存储桶被创建的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,否则打开链接会直接下载文件而不是播放视频/查看图片。
| 参数 | 类型 | 描述 |
|---|---|---|
bucketName | string | 存储桶名称 |
objectName | string | 对象的名称 |
filePath | string | 要上传的文件的路径 |
opts | minio.PutObjectOptions | 允许用户设置可选的自定义元数据,content-type,content-encoding,content-disposition以及cache-control headers,传递加密模块以加密对象,并可选地设置multipart put操作的线程数量。 |
例如,我设定桶名称为videotest,文件名为test.mp4,上传成功后可在对应data/video下看到上传的文件。通过浏览器console地址也可以看到上传的视频信息

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

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