自研存储网关对接华为云对象存储服务的经历丨【我的华为云体验之旅】
【摘要】 前言随着科学技术的不断发展,在不远的将来,音视频技术将逐步成为一切事物展现自我价值的载体之一,比如最近火热的元宇宙概念,其中涉及的 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)