这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
什么是OSS对象存储?
OSS的英文全称是Object Storage Service,翻译成中文就是对象存储服务。OSS非常适合存储静态资源,提供HTTP链接的方式来访问到静态资源,例如图片,减轻业务服务器存储静态文件的压力。OSS对象存储是为企业用户提供的一种安全稳定、低成本、高可用的非结构化云存储服务,解决用户海量数据管理问题;且使用对象存储可以在互联网任意位置存储和访问,具有无上限、弹性拓展、多类型等特点。
优点
1、稳定可靠:对象存储具有多重冗余架构设计;且基于高可用架构设计,消除单节点故障,跨数据中心的副本冗余,能够保障服务的高可用性,确保数据业务的持续性;
2、安全合规:支持服务端加密、客户端加密、防盗链、IP黑白名单、细粒度权限管控、日志审计、WORM特性,并获得多项合规认证,满足企业数据安全与合规要求;
3、智能存储:存储空间无上限,无需担心扩容问题,能够实现存储需求的弹性伸缩;并且提供多种数据处理能力,无缝对接快快云服务器等产品,从而提高业务灵活性;
4、低成本:无需传统硬件的采购、部署和运维,从而节省了运维工作和托管成本,有效避免存储及带宽资源的闲置浪费,降低企业的数据管理与存储成本。
七牛云
选择七牛云 对象存储服务来实现OSS功能,因为是免费的。
七牛云: portal.qiniu.com
创建教程: blog.csdn.net/weixin_5545…
学习链接
官网教程: 78re52.com1.z0.glb.clouddn.com/docs/v6/sdk…
最终参考教程: blog.csdn.net/weixin_4530… (有七牛云步骤)
上传文件(基础版)
代码
sevice/videoSevice.go
package video
import (
"fmt"
"go_douyin/global/variable" "io" "mime/multipart" "os")
// 保存文件
func SaveFile(file multipart.File, header *multipart.FileHeader) bool {
filename := header.Filename
fmt.Println(header.Filename)
out, err := os.Create(variable.BasePath + "/config/" + filename)
if err != nil {
fmt.Println(err)
return false
}
defer out.Close()
_, err = io.Copy(out, file)
if err != nil {
fmt.Println(err)
return false
}
return true
}
controller/videoController.go
package controller
import (
"fmt"
"github.com/gin-gonic/gin" "go_douyin/service/video" "net/http")
type VideoController struct {
}
func NewVideoController() *VideoController {
return &VideoController{}
}
func (h *VideoController) UploadFile(c *gin.Context) {
file, header, _ := c.Request.FormFile("data")
video.SaveFile(file, header)
token := c.PostForm("token")
title := c.PostForm("title")
fmt.Println(token, title)
//service.UploadService(param1, param2, filename)
c.String(http.StatusOK, "File uploaded successfully")
}
router/router.go
// 用户组:登录注册,获取个人信息
v3 := router.Group("/douyin/publish")
{
v3.POST("action", videoController.UploadFile)
}
配置
# 注意现在是这个,而不是上面教程写的
go get github.com/qiniu/api.v7/v7
go get github.com/qiniu/api.v7/v7/storage@v7.8.2
七牛云上传文件(小例子)
utils/video_file/video_file.go
// 上传文件到七牛云
func UploadFileToQiNiu(file multipart.File) (int, string) {
// 获取文件大小
fileSize, err := file.Seek(0, io.SeekEnd)
if err != nil {
// handle error
}
_, err = file.Seek(0, io.SeekStart)
if err != nil {
// handle error
}
// 构建鉴权对象(这里需要对应改成自己的)
var AccessKey = variable.Config.GetString("CDN.AccessKey")
var SerectKey = variable.Config.GetString("CDN.SercetKey")
var Bucket = variable.Config.GetString("CDN.Bucket")
var ImgUrl = variable.Config.GetString("CDN.QiniuServer")
putPlicy := storage.PutPolicy{
Scope: Bucket,
}
mac := qbox.NewMac(AccessKey, SerectKey)
upToken := putPlicy.UploadToken(mac)
cfg := storage.Config{
Zone: &storage.ZoneHuanan,
UseCdnDomains: false,
UseHTTPS: false,
}
putExtra := storage.PutExtra{}
formUploader := storage.NewFormUploader(&cfg)
ret := storage.PutRet{}
err = formUploader.PutWithoutKey(context.Background(), &ret, upToken, file, fileSize, &putExtra)
if err != nil {
code := 500
return code, err.Error()
}
url := ImgUrl + "/" + ret.Key
return 200, url
}
service/videoService.go
// 保存文件
func SaveFile(file multipart.File, header *multipart.FileHeader) bool {
filename := header.Filename
fmt.Println(header.Filename)
out, err := os.Create(variable.BasePath + "/output/" + filename)
if err != nil {
fmt.Println(err)
return false
}
defer out.Close()
_, err = io.Copy(out, file)
//截取第一页作为封面
video_file.ExtractFirstFrame(variable.BasePath+"/output/"+filename, variable.BasePath+"/output/"+"第一帧图片.jpg")
//上传到七牛云
fmt.Println(video_file.UploadFileToQiNiu(file))
if err != nil {
fmt.Println(err)
return false
}
return true
}
config.yml
CDN:
AccessKey: ……
SercetKey: ……
Bucket: ……
QiniuServer: ……
以上便是使用七牛云的例子,上面案例中还使用了ffmpeg截取视频第一帧作为封面,具体代码会在下期讲解。