这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
前言
为了在项目中存储上传的视频核封面,使用对象的方式
什么是minio
MinIO 提供高性能、与S3 兼容的对象存储系统,让你自己能够构建自己的云储存服务。
MinIO原生支持 Kubernetes,它可用于每个独立的公共云、每个 Kubernetes 发行版、私有云和边缘的对象存储套件。
MinIO是软件定义的,不需要购买其他任何硬件,在 GNU AGPL v3 下是 100% 开源的。
- 简单
- 高性能
- k8s原生支持
minio搭建
下载docker镜像
docker pull minio/minio
运行minio
docker run -p 9000:9000 -p 9090:9090 \
--net=host \
--name minio \
-d --restart=always \
-e "MINIO_ACCESS_KEY=minioadmin" \
-e "MINIO_SECRET_KEY=minioadmin" \
-v /home/minio/data:/data \
-v /home/minio/config:/root/.minio \
minio/minio server \
MINIO_SEREVR_URL=http://宿主机ip:9000 \
/data --console-address ":9090" -address ":9000"
需要注意的点
在上面如果不加 MINIO_SEREVR_URL,会导致在使用的时候url签名错误,无法下载文件
使用实例
package main
import (
"context"
"fmt"
"io/ioutil"
"log"
"os"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
func main() {
// 建立一个MinIO客户端对象
endpoint := "minio.example.com" // MinIO服务的地址
accessKeyID := "your-access-key-id" // Access Key ID
secretAccessKey := "your-secret-access-key" // Secret Access Key
useSSL := true // 是否启用SSL
minioClient, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
Secure: useSSL,
})
if err != nil {
log.Fatalln(err)
}
// 上传文件到MinIO存储桶
bucketName := "example-bucket" // 存储桶名称
objectName := "example-object.txt" // 上传的对象名称
filePath := "/path/to/example-file.txt" // 本地文件路径
// 打开本地文件
file, err := os.Open(filePath)
if err != nil {
log.Fatalln(err)
}
defer file.Close()
// 获取本地文件的大小
fileInfo, err := file.Stat()
if err != nil {
log.Fatalln(err)
}
fileSize := fileInfo.Size()
// 创建一个上下文对象,用于取消上传操作
ctx := context.Background()
// 上传文件到MinIO
n, err := minioClient.PutObject(ctx, bucketName, objectName, file, fileSize, minio.PutObjectOptions{})
if err != nil {
log.Fatalln(err)
}
fmt.Printf("Successfully uploaded %s of size %d\n", objectName, n)
}
endpoint是 MinIO 服务的地址。accessKeyID和secretAccessKey是访问 MinIO 服务的凭证。在实际应用中,应该使用安全方式存储这些敏感信息,例如环境变量或配置文件。useSSL指定是否启用 SSL 加密。minio.New函数返回一个*minio.Client对象,用于与 MinIO 服务进行交互。