自研存储网关对接华为云对象存储服务的经历丨【我的华为云体验之旅】

举报
liuzhen007 发表于 2021/12/30 01:21:43 2021/12/30
【摘要】 前言随着科学技术的不断发展,在不远的将来,音视频技术将逐步成为一切事物展现自我价值的载体之一,比如最近火热的元宇宙概念,其中涉及的 AR、VR 效果都将以音频和视频的形式展现出来。如果你现在还在犹豫进入哪个领域发展,音视频领域可以作为一个候选项。毕业后本人一直在音视频领域工作和学习,具有了丰富的音视频直播和点播相关开发经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了...

前言

随着科学技术的不断发展,在不远的将来,音视频技术将逐步成为一切事物展现自我价值的载体之一,比如最近火热的元宇宙概念,其中涉及的 AR、VR 效果都将以音频和视频的形式展现出来。如果你现在还在犹豫进入哪个领域发展,音视频领域可以作为一个候选项。毕业后本人一直在音视频领域工作和学习,具有了丰富的音视频直播和点播相关开发经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解。多年的经验告诉我:一个持久化的音视频服务产品,一定会涉及到音视频的存储问题。今天,我们就来看一下华为云的对象存储服务。

正文

一、开通对象存储服务


首先,我们需要开通华为云的对象存储服务,开通地址:https://www.huaweicloud.com/product/obs.html


二、创建存储桶

接下来就是创建存储桶,注意要起一个特立独行的名字,因为很容易重名,自己试了半天才确定最终的存储桶名称。
存储桶名称是 liuzhen007,在桶列表中可以查看到账号下所有的存储桶信息,具体如下图所示:

三、获取Key信息

想要集成华为云的对象存储服务,一共有三种方式可以获取授权,具体如下:

1. 通过委托获取临时访问密钥和 securitytoken。

2. 通过token获取临时访问密钥和 securitytoken。

3. 创建永久的访问密钥。

我们今天以第三种方式进行介绍,在“控制台”-“我的凭证”-“访问密钥”,具体如下图所示:

单击“新增访问密钥”,输入验证码或密码。需要注意的是每个用户最多只能创建2个访问密钥,不支持增加配额。生成并下载访问密钥。生成密钥后,请及时下载保存,弹窗关闭后将无法再次获取该密钥信息,但是可以重新创建新的密钥。

四、编写配置文件

由于对象存储服务需要密钥,可能会经常变化,最好以配置文件的形式动态支持。其中,华为云对象存储配置结构体定义如下:

type HuaweiOBS struct {
	BucketName string `json:"bucketName"`
	AccessKey  string `json:"accessKey"`
	SecretKey  string `json:"secretKey"`
	EndPoint   string `json:"endPoint"`
}

配置文件:

五、创建客户端对象

使用对象存储服务的前提是创建客户端对象,具体定义如下:

// 创建华为云 OBS 客户端
func NewOBSClient() *obs.ObsClient {
	endPoint := config.GetConfig().HuaweiOBS.EndPoint
	accessKey := config.GetConfig().HuaweiOBS.AccessKey
	secretKey := config.GetConfig().HuaweiOBS.SecretKey
	bucketName := config.GetConfig().HuaweiOBS.BucketName

	client, err := obs.New(accessKey, secretKey, endPoint)
	if err != nil {
		logrus.Error("创建 OBS 客户端失败:", err.Error())
		return nil
	}
	return client
}

六、创建存储桶

存储桶是用来存储数据的容器,因此创建完客户端就需要存储桶了,代码如下:

// 创建存储桶私有方法
func createObsBucket(client *obs.ObsClient, bucketName string) {
	input := &obs.CreateBucketInput{}
	input.Bucket = bucketName
	output, err := client.CreateBucket(input)
	if err == nil {
		logrus.Infof("创建存储桶成功, RequestId: %s", output.RequestId)
	} else {
		if obsError, ok := err.(obs.ObsError); ok {
			logrus.Errorf("创建存储桶失败, Code: %s, Message: %s", obsError.Code, obsError.Message)
		} else {
			logrus.Errorf("创建存储桶异常 %s", err.Error())
		}
	}
}

七、上传方法

上传对象是增操作,具体定义如下:

// 上传对象
func (*HuaweiOBS) UploadFile(file *multipart.FileHeader) (string, string, error) {
	input := &obs.PutObjectInput{}
	input.Bucket = config.GetConfig().HuaweiOBS.BucketName
	fileName := file.Filename
	fileKey := fmt.Sprintf("%d/%s", time.Now().Unix(), fileName)
	input.Key = fileKey
	fd, openError := file.Open()
	if openError != nil {
		logrus.Error("function file.Open() Failed", zap.Any("err", openError.Error()))
		return "", "", errors.New("function file.Open() Failed, err:" + openError.Error())
	}
	input.Body = fd
	obsClient := NewOBSClient()
	output, err := obsClient.PutObject(input)
	if err == nil {
		logrus.Infof("RequestId: %s, ETag: %s", output.RequestId, output.ETag)
	} else if obsError, ok := err.(obs.ObsError); ok {
		logrus.Errorf("Code: %s, Message: %s", obsError.Code, obsError.Message)
	}

	preUrl, err := getOBSURLPrefix()
	if err != nil {
		logrus.Errorf("获取 URL 前缀失败 %s", err.Error())
	}

	return preUrl + "/" + fileKey, fileKey, nil
}

八、删除方法

删除对象是减操作,具体定义如下:

// 删除对象
func (*HuaweiOBS) DeleteFile(key string) error {
	input := &obs.DeleteObjectInput{}
	input.Bucket = config.GetConfig().HuaweiOBS.BucketName
	input.Key = key
	obsClient := NewOBSClient()
	output, err := obsClient.DeleteObject(input)
	if err == nil {
		logrus.Infof("删除文件成功, RequestId: %s", output.RequestId)
	} else {
		if obsError, ok := err.(obs.ObsError); ok {
			logrus.Errorf("删除失败, Code: %s, Message: %s", obsError.Code, obsError.Message)
		} else {
			logrus.Errorf("删除异常 %s", err.Error())
		}
	}

	return nil
}

九、效果演示

上传演示:

删除演示:

结论

好了,终于把华为云的对象存储服务集成好了,整体上感觉集成 OBS 的 SDK 还是非常简单。


【我的华为云体验之旅】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/309059

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。