青训营项目记录4:使用七牛云免费对象存储保存用户上传的视频和封面 | 青训营笔记

99 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天

后端青训营需要接收用户上传的视频,比较简单的方式是保存到本地的文件系统中,但这对本地磁盘的容量和读写性能提出了要求。因此,可以使用云存储的方式来保存视频,例如使用七牛云的免费对象存储产品kodo。

产品概述

七牛云对象存储 Kodo 是七牛云提供的高可靠、强安全、低成本、可扩展的存储服务。您可通过控制台、API、SDK 等方式简单快速地接入七牛存储服务,实现海量数据的存储和管理。通过 Kodo 可以进行文件的上传、下载和管理。

此外,Kodo 的姊妹产品融合 CDN**可以对文件下载进行加速,智能多媒体 API**更是提供了丰富的基于海量数据深度学习算法的计算机视觉服务,如人脸技术、场景物体识别、OCR 文字识别和内容审核等。

Kodo 主要应用于以下一些场景:

在线存储和分发

七牛云对象存储提供高可用和高可靠的对象存储服务,您可以放心的将各种内容存储在云端。利用七牛云对象存储的扩展性和按需付费的优势,可以满足您持续快速增长的存储需求。您也可以搭配使用七牛云的对象存储和融合 CDN**服务,实现全球覆盖、快速高效的内容分发。

镜像存储

七牛云对象存储支持镜像存储,这是一种快速的数据迁移和加速服务。可以帮助您实现无缝数据迁移,迁移过程中并不影响原有业务系统的访问。镜像存储适用于迁移原有业务系统的已有数据。

备份和归档

七牛云对象存储提供高可用和高可靠的存储解决方案来备份和归档您的关键数据。通过七牛云的身份验证机制可以设置不同的访问权限和级别,保障您数据的访问安全。相比传统自建的备份和归档存储系统,您无需在业务初期采购高昂硬件,无需担心数据增长带来的扩容问题,从而节省更多的存储成本、维护成本和人力资源成本。

富媒体数据处理

针对海量的用户生成内容,七牛云对象存储能够提供跨地域、高并发的内容上传和访问服务。同时结合七牛云提供的数据处理服务,可以在云端实现图片裁剪、格式转化和水印,以及视频转码、切片和拼接等富媒体处理功能,满足移动网络场景下多终端设备的访问需求。

静态资源托管

七牛云对象存储无缝集合各类第三方扩展插件,如 WordPress、Discuz、Emlog 等,并支持一键将各类插件里的静态资源托管到七牛云对象存储。

注册七牛云

七牛云 | 一站式场景化智能视频云 (qiniu.com)

在七牛云官网注册账号,即可永久0元享用云存储服务kodo。

image.png

控制台

在控制台里可以新建空间,例如这里我新建了一个liujingping-doushen的空间,并上传了一些文件。空间的名称需要记住,后续在代码中需要填写bucket_name参数时,要用到空间的名称。 image.png

获取上传密钥

在个人中心:七牛云 - 密钥管理 (qiniu.com),可以查看access_key和secret_key,如下图所示。

image.png

上传文件

上传时首先需要构造上传凭证,然后调用相应的接口即可。这里以七牛云的golang语言的SDK为例,展示如何用Go语言上传字节流文件。

package service

import (
   "bytes"
   "context"
   "fmt"
   "github.com/qiniu/go-sdk/v7/auth/qbox"
   "github.com/qiniu/go-sdk/v7/storage"
   "io"
)

var bucket = "空间名称"  //上文中的是liujingping-doushen
var accessKey = "用户公钥"  // 上文中的是kasbWDX_UW5oxkxDdGuGSNM6NMAM4GlN2LBVMoUj
var secretKey = "用户私钥"  // 请通过自己的账号获取私钥

func UploadFile(key string, file io.Reader) (string, string, string, error) {
   buf := &bytes.Buffer{}
   if _, err := buf.ReadFrom(file); err != nil {
      return "", "", "", err
   }
   data := buf.Bytes()
   return Upload(key, data)
}

func Upload(key string, data []byte) (string, string, string, error) {
   putPolicy := storage.PutPolicy{
      Scope: bucket,
   }
   mac := qbox.NewMac(accessKey, secretKey)
   upToken := putPolicy.UploadToken(mac)

   cfg := storage.Config{}
   // 空间对应的机房
   cfg.Region = &storage.ZoneHuadongZheJiang2
   // 是否使用https域名
   cfg.UseHTTPS = true
   // 上传是否使用CDN上传加速
   cfg.UseCdnDomains = false
   formUploader := storage.NewFormUploader(&cfg)
   ret := storage.PutRet{}
   putExtra := storage.PutExtra{
      Params: map[string]string{
         "x:name": "github logo",
      },
   }

   dataLen := int64(len(data))
   err := formUploader.Put(context.Background(), &ret, upToken, key, bytes.NewReader(data), dataLen, &putExtra)
   fmt.Println(ret.Key, ret.PersistentID)
   return ret.Key, ret.Hash, ret.PersistentID, err
}

下载文件

下载文件只需要提供url即可,在创建完空间之后,会提供一个免费的30天的url供测试用,使用storage.MakePublicURL将url和文件名拼接起来,即可得到对象的下载链接。

func GetPublicURL(key string) string {
   domain := "http://rp3814hyw.bkt.clouddn.com"
   publicAccessURL := storage.MakePublicURL(domain, key)
   return publicAccessURL
}

参考资料

更多细节请参考七牛云Go官方SDK文档

Go SDK_SDK 下载_对象存储 - 七牛开发者中心 (qiniu.com)