gin和gorm进阶功能(7)之OSS存储 | 青训营笔记

224 阅读3分钟

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

什么是OSS对象存储?

OSS的英文全称是Object Storage Service,翻译成中文就是对象存储服务。OSS非常适合存储静态资源,提供HTTP链接的方式来访问到静态资源,例如图片,减轻业务服务器存储静态文件的压力。OSS对象存储是为企业用户提供的一种安全稳定、低成本、高可用的非结构化云存储服务,解决用户海量数据管理问题;且使用对象存储可以在互联网任意位置存储和访问,具有无上限、弹性拓展、多类型等特点。

优点

1、稳定可靠:对象存储具有多重冗余架构设计;且基于高可用架构设计,消除单节点故障,跨数据中心的副本冗余,能够保障服务的高可用性,确保数据业务的持续性;

2、安全合规:支持服务端加密、客户端加密、防盗链、IP黑白名单、细粒度权限管控、日志审计、WORM特性,并获得多项合规认证,满足企业数据安全与合规要求;

3、智能存储:存储空间无上限,无需担心扩容问题,能够实现存储需求的弹性伸缩;并且提供多种数据处理能力,无缝对接快快云服务器等产品,从而提高业务灵活性;

4、低成本:无需传统硬件的采购、部署和运维,从而节省了运维工作和托管成本,有效避免存储及带宽资源的闲置浪费,降低企业的数据管理与存储成本。

七牛云

选择七牛云 对象存储服务来实现OSS功能,因为是免费的。

七牛云: portal.qiniu.com

创建教程: blog.csdn.net/weixin_5545…

学习链接

blog.csdn.net/qq_36034503…

官网教程: 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截取视频第一帧作为封面,具体代码会在下期讲解。