Gin+微服务实现抖音视频上传到七牛云

文章目录

  • 安装
  • 获取凭证
  • Gin处理
  • 微服务处理

如果你对Gin和微服务有一定了解,看本文较容易。

安装

执行命令:

go get github.com/qiniu/go-sdk/v7

获取凭证

Go SDK 的所有的功能,都需要合法的授权。授权凭证的签算需要七牛账号下的一对有效的Access KeySecret Key,这对密钥可以通过如下步骤获得:

  1. 点击注册🔗开通七牛开发者帐号
  2. 如果已有账号,直接登录七牛开发者后台,点击这里🔗查看 Access Key 和 Secret Key

image-20230820142217408

准备好这四个基本配置,供后面使用:

SecretKey = your secretkey

AccessKey = your accesskey

Bucket = your bucket

Domain = your domain

Gin处理

由于proto文件是这样定义的:

message PublishRequest{// @inject_tag: json:"data" form:"data"bytes data = 1; // 视频数据
}

也就是说data数据是bytes类型,这意味着我们通过Gin从前端获取的视频要转化为字节数组,这样才能传给相应的微服务,然后对应的微服务实现视频上传。

下面是Gin的处理逻辑:

videoPb.PublishRequest和videoPb.PublishResponse就是你用proto文件生成对应的后缀为pb.go里面的东西。

func PublishHandler(ctx *gin.Context) {var req videoPb.PublishRequest//将获得的文件转为[]byte类型data, err := ctx.FormFile("data")if err != nil {ctx.JSON(http.StatusInternalServerError, FailRequest(err.Error()))}file, err := data.Open()defer file.Close()if err != nil {ctx.JSON(http.StatusInternalServerError, FailRequest(err.Error()))}// 使用缓冲区逐块读取文件内容并写入 req.Datavar buffer bytes.Buffer_, err = io.Copy(&buffer, file)if err != nil {ctx.JSON(http.StatusInternalServerError, FailRequest(err.Error()))return}req.Data = buffer.Bytes()//这里表示远程调用相关的微服务res, err := Publish(ctx, &req)if err != nil {ctx.JSON(http.StatusInternalServerError, FailRequest(err.Error()))return}ctx.JSON(http.StatusOK, gin.H{"status_code": res.StatusCode,"status_msg":  res.StatusMsg,})
}func Publish(ctx context.Context, req *videoPb.PublishRequest) (res *videoPb.PublishResponse, err error) {res, err = VideoService.Publish(ctx, req)if err != nil {return}return
}func FailRequest(StatusMsg string) gin.H {return gin.H{"status_code": 1,"status_msg":  StatusMsg,}
}
  1. PublishHandler函数:这是一个Gin路由处理函数,用于接收前端传来的视频数据并处理上传逻辑。
  2. 解析上传的视频数据:
    • 通过 ctx.FormFile("data") 从请求中获取上传的文件。
    • 通过 data.Open() 打开文件。
    • 使用缓冲区逐块读取文件内容并写入 req.Data 字段,将视频数据存储为字节数组。
  3. 调用远程微服务:
    • 使用创建好的 videoPb.PublishRequest 实例 req,其中已经存储了上传的视频数据。
    • 调用 Publish 函数,并将 ctxreq 作为参数传递给该函数。
  4. 处理微服务的响应:
    • 将微服务的响应信息提取出来,包括状态码和状态消息。
    • 使用这些信息构建一个JSON响应,并返回给前端。

微服务处理

下面是对应的微服务处理逻辑:

func (v *VideoSrv) Publish(ctx context.Context, req *videoPb.PublishRequest, res *videoPb.PublishResponse) error {data := req.DataVideoUrl, err := util.UploadVideo(data)if err != nil {PublishResponseData(res, 1, "发布失败")return err}PublishResponseData(res, 0, "发布成功")return nil}func UploadVideo(data []byte) (VideoUrl string, err error) {SecretKey = your secretkeyAccessKey = your accesskeyBucket = your bucketDomain = your domainsize := int64(len(data))//也可以用时间戳,这里用的uuidkey := fmt.Sprintf("%s.mp4", GenerateUUID())putPolicy := storage.PutPolicy{Scope: fmt.Sprintf("%s:%s", Bucket, key),}mac := qbox.NewMac(AccessKey, SecretKey)upToken := putPolicy.UploadToken(mac)cfg := storage.Config{}uploader := storage.NewFormUploader(&cfg)ret := storage.PutRet{}//可选配置putExtra := storage.PutExtra{Params: map[string]string{"x:name": "github logo",},}err = uploader.Put(context.Background(), &ret, upToken, key, bytes.NewReader(data), size, &putExtra)if err != nil {return "", err}return fmt.Sprintf("%s/%s", Domain, ret.Key), nil
}func PublishResponseData(res *videoPb.PublishResponse, StatusCode int32, StatusMsg string) {res.StatusCode = StatusCoderes.StatusMsg = StatusMsg
}func GenerateUUID() string {id := uuid.New()return id.String()
}
  1. Publish 函数:这是微服务中的一个处理函数,用于接收上传请求并进行视频上传逻辑。
  2. 上传视频逻辑:
    • 从请求的 req.Data 中获取视频数据。
    • 使用 util.UploadVideo 函数将视频数据上传到云存储服务中(这里使用七牛云存储)。
  3. 生成上传凭证和URL:
    • 准备上传的参数,如存储空间、文件名等。
    • 创建上传凭证,使用七牛云的 AccessKey 和 SecretKey。
    • 通过七牛云的 SDK 进行文件上传,将视频数据上传到指定位置。
    • 生成上传后的视频URL,结合存储域名和文件名。
  4. 设置微服务的响应:
    • 根据上传成功与否,设置相应的状态码和状态消息。
    • 将这些信息填充到 videoPb.PublishResponse 实例中。
  5. 辅助函数和UUID生成:
    • PublishResponseData 函数:用于填充响应对象的状态码和状态消息。
    • GenerateUUID 函数:生成唯一标识符,通常用于生成上传文件的唯一键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/45517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rn和flutter出现“Running Gradle task ‘assembleDebug

在第一次运行rn和flutter时,会卡在Running Gradle task assembleDebug,可以使用阿里的镜像,如下图: maven { url https://maven.aliyun.com/repository/google/ } google() maven { url https://maven.aliyun.com/repository/jcen…

计算机网络----CRC冗余码的运算

目录 1. 冗余码的介绍及原理2. CRC检验编码的例子3. 小练习 1. 冗余码的介绍及原理 冗余码是用于在数据链路层的通信链路和传输数据过程中可能会出错的一种检错编码方法(检错码)。原理:发送发把数据划分为组,设每组K个比特&#…

详解strcmp函数

strcmp函数是用来比较两个字符串的,按理来说,比较结果只有两种:相同或不同。但是,事实上,strcmp函数在设计时会有三种情况,下面详细介绍: 这个函数的输入为两个字符串的首元素地址(即…

Excel/PowerPoint折线图从Y轴开始(两侧不留空隙)

默认Excel/PowerPoint折线图是这个样子的: 左右两侧都留了大块空白,很难看 解决方案 点击横坐标,双击,然后按下图顺序点击 效果

Docker运行Nacos容器,过一会就报错`UnsatisfiedDependencyException`

Docker运行Nacos容器,过一会就报错UnsatisfiedDependencyException 问题背景: 最近要上线一个项目,由于要使用Nacos作为服务注册中心,为了方便,我就打算直接使用Docker部署Nacos,没想到Nacos启动没一会就嗝…

STM32 F103C8T6学习笔记10:OLED显示屏GIF动图取模—简易时钟—动图手表的制作~

今日尝试做一款有动图的OLED实时时钟,本文需要现学一个OLED的GIF动图取模 其余需要的知识点有不会的可以去我 STM32 F103C8T6学习笔记 系列专栏自己查阅把,闲话不多,直接开肝~~~ 文章提供源码,测试工程下载,测试效…

(二)结构型模式:5、装饰器模式(Decorator Pattern)(C++实例)

目录 1、装饰器模式(Decorator Pattern)含义 2、装饰器模式的UML图学习 3、装饰器模式的应用场景 4、装饰器模式的优缺点 5、C实现装饰器模式的简单实例 1、装饰器模式(Decorator Pattern)含义 装饰模式(Decorato…

负载均衡下的 WebShell 连接

目录 负载均衡简介负载均衡的分类网络通信分类 负载均衡下的 WebShell 连接场景描述难点介绍解决方法**Plan A** **关掉其中一台机器**(作死)**Plan B** **执行前先判断要不要执行****Plan C** 在Web 层做一次 HTTP 流量转发 (重点&#xff0…

HummingBird 基于 Go 开源超轻量级 IoT 物联网平台

蜂鸟(HummingBird) 是 Go 语言实现的超轻量级物联网开发平台,包含设备接入、产品管理、物模型、告警中心、规则引擎等丰富功能模块。系统采用GoLang编写,占用内存极低, 单物理机可实现百设备的连接。 在数据存储上&…

MATLAB | 七夕节用MATLAB画个玫瑰花束叭

Hey又是一年七夕节要到了,每年一次直男审美MATLAB绘图大赛开始hiahiahia,真的这些代码越写越不知道咋写,又不想每年把之前的代码翻出来再发一遍,于是今年又对我之前写的老代码进行了点优化组合,整了个花球变花束&#…

人工智能大模型加速数据库存储模型发展 行列混合存储下的破局

数据存储模型 ​专栏内容: postgresql内核源码分析手写数据库toadb并发编程toadb开源库 个人主页:我的主页 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 概述 在数据库的发展过程中,关…

系统架构设计专业技能 · 软件工程之需求工程

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估(二)【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…

Qt快速学习(一)--对象,信号和槽

目录 1.Qt概述 1.1 什么是Qt 2.2 手动创建 2.3 pro文件 2.4 一个最简单的Qt应用程序 3 第一个Qt小程序 3.1 按钮的创建 3.2 对象模型(对象树) 3.3 Qt窗口坐标体系 4 信号和槽机制 4.1 系统自带的信号和槽 4.2 自定义信号和槽 4.3信号槽的拓展 4…

Edge浏览器免费使用GPT3.5

搜索sider,安装Sidebar插件 注册账号即可每天免费使用30次。 Sider: ChatGPT侧边栏,GPT-4, 联网, 绘图

C++ 的关键字(保留字)完整介绍

1. asm asm (指令字符串):允许在 C 程序中嵌入汇编代码。 2. auto auto(自动,automatic)是存储类型标识符,表明变量"自动"具有本地范围,块范围的变量声明(如for循环体内的变量声明…

机器学习深度学习——NLP实战(情感分析模型——RNN实现)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——NLP实战(情感分析模型——数据集) 📚订阅专栏:机器学习&…

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序)

参考文章: re学习笔记(27)攻防世界-re-csaw2013reversing2_Forgo7ten的博客-CSDN博客攻防世界逆向入门题之csaw2013reversing2_沐一 林的博客-CSDN博客 三种做法 1、ida静态分析修改指令 main函数反编译的代码 由于运行之后的是乱码&…

[oneAPI] 手写数字识别-BiLSTM

[oneAPI] 手写数字识别-BiLSTM 手写数字识别参数与包加载数据模型训练过程结果 oneAPI 比赛:https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517 Intel DevCloud for oneAPI:https://devcloud.intel.com/oneapi/get_started/aiAnalyticsToo…

python rtsp 硬件解码 二

上次使用了python的opencv模块 述说了使用PyNvCodec 模块,这个模块本身并没有rtsp的读写,那么读写rtsp是可以使用很多方法的,我们为了输出到pytorch直接使用AI程序,简化rtsp 输入,可以直接使用ffmpeg的子进程 方法一 …

STM8遇坑[EEPROM读取debug不正常release正常][ STVP下载成功单运行不成功][定时器消抖莫名其妙的跑不通流程]

EEPROM读取debug不正常release正常 这个超级无语,研究和半天,突然发现调到release就正常了,表现为写入看起来正常读取不正常,这个无语了,不想研究了 STVP下载不能够成功运行 本文摘录于:https://blog.csdn.net/qlexcel/article/details/71270780只是做学习备份之…