Gin+微服务实现抖音视频上传到七牛云
文章目录
- 安装
- 获取凭证
- Gin处理
- 微服务处理
如果你对Gin和微服务有一定了解,看本文较容易。
安装
执行命令:
go get github.com/qiniu/go-sdk/v7
获取凭证
Go SDK 的所有的功能,都需要合法的授权。授权凭证的签算需要七牛账号下的一对有效的Access Key
和Secret Key
,这对密钥可以通过如下步骤获得:
- 点击注册🔗开通七牛开发者帐号
- 如果已有账号,直接登录七牛开发者后台,点击这里🔗查看 Access Key 和 Secret Key
准备好这四个基本配置,供后面使用:
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,}
}
PublishHandler
函数:这是一个Gin路由处理函数,用于接收前端传来的视频数据并处理上传逻辑。- 解析上传的视频数据:
- 通过
ctx.FormFile("data")
从请求中获取上传的文件。 - 通过
data.Open()
打开文件。 - 使用缓冲区逐块读取文件内容并写入
req.Data
字段,将视频数据存储为字节数组。
- 通过
- 调用远程微服务:
- 使用创建好的
videoPb.PublishRequest
实例req
,其中已经存储了上传的视频数据。 - 调用
Publish
函数,并将ctx
和req
作为参数传递给该函数。
- 使用创建好的
- 处理微服务的响应:
- 将微服务的响应信息提取出来,包括状态码和状态消息。
- 使用这些信息构建一个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()
}
Publish
函数:这是微服务中的一个处理函数,用于接收上传请求并进行视频上传逻辑。- 上传视频逻辑:
- 从请求的
req.Data
中获取视频数据。 - 使用
util.UploadVideo
函数将视频数据上传到云存储服务中(这里使用七牛云存储)。
- 从请求的
- 生成上传凭证和URL:
- 准备上传的参数,如存储空间、文件名等。
- 创建上传凭证,使用七牛云的 AccessKey 和 SecretKey。
- 通过七牛云的 SDK 进行文件上传,将视频数据上传到指定位置。
- 生成上传后的视频URL,结合存储域名和文件名。
- 设置微服务的响应:
- 根据上传成功与否,设置相应的状态码和状态消息。
- 将这些信息填充到
videoPb.PublishResponse
实例中。
- 辅助函数和UUID生成:
PublishResponseData
函数:用于填充响应对象的状态码和状态消息。GenerateUUID
函数:生成唯一标识符,通常用于生成上传文件的唯一键。
相关文章:
Gin+微服务实现抖音视频上传到七牛云
文章目录 安装获取凭证Gin处理微服务处理 如果你对Gin和微服务有一定了解,看本文较容易。 安装 执行命令: go get github.com/qiniu/go-sdk/v7获取凭证 Go SDK 的所有的功能,都需要合法的授权。授权凭证的签算需要七牛账号下的一对有效的A…...
go 连接操作MySQL
连接Mysql 访问此网站搜索MySQL第一个就是按照指引运行 go get -u github.com\go-sql-driver\mysql导入包建立连接 package mainimport ("database/sql""fmt""time"_ "github.com/go-sql-driver/mysql" )var db *sql.DBfunc initdb…...
git常见的命令,问题和处理方式
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方…...
Ubuntu环境下超好用的文件对比工具软件meld
Ubuntu环境下超好用的文件对比工具软件_ubuntu 代码比较工具_Calculation K的博客-CSDN博客...
Channel是什么?FileChannel类的常用方法
Channel 是一个接口对象,它类似于传统的流对象,但与传统的流对象又有些不同,具体表现如下: • Channel可以异步地执行I/O读写操作。 • Channel的读写操作是双向的,既可以从 Channel中读取数据,又可以写数据到Channel,而流的读写操作通常都是单向的。 • Channel…...
Python爬虫——scrapy_读书网数据入库和链接跟进
数据入库 先创建一个数据库 create table book(id int primary key auto_increment,name varchar(128),src varchar(128));settings.py DB_HOST 169.254.38.183 # 端口号是一个整数 DB_PORT 3306 DB_USER root DB_PASSWORD 123456 # 数据库名称 DB_NAME spider01 DB_CHA…...
前端常用linux命令
前端开发也需要掌握一些常用的linux命令,以便在linux系统上做一些操作如nginx代理配置,项目解压发布等 1、cd 切换目录 cd / //切换到根目录 cd directory_path //切换到directory_path目录 cd ../ //切换到上一级目录2、ls 列出目录内容 ls3…...
制作高质量SVG的最佳工具,这些编辑软件你需要知道!
作为前端开发者,想要学习更高级的可视化技术,SVG 编辑工具是必学的。与其他图像格式相比,SVG 图像可任意缩放而不损失质量,还可以实现交互动画效果,一个好的 SVG 编辑器能大大简化你的学习过程。下面就跟随小编一起看看…...
四、MySQL性能优化
1、SQL性能优化 1、如何分析SQL的性能? 我们可以使用EXPLAIN命令来分析SQL的执行计划 ,执行计划是指一条SQL语句在经过MySQL查询优化器的选择后具体的执行方式 EXPLAIN并不会真的去执行相关的语句,而是通过查询优化器 对语句进行分析&…...
Oracle Database12c数据库官网下载和安装教程
文章目录 下载安装Oracle自带的客户端工具使用 下载 进入oracle官网 点击下载连接之后右上角会有一个下载 我们只需要数据库本体就够了 运行这个下载器 等待下好之后即可 出现 Complete 之后代表下载成功,然后我们解压即可 安装 双击 双击setup.exe 根据…...
spring依赖注入详解(下)
Autowired注解依赖注入过程 一、findAutowireCandidates()实现 找出BeanFactory中类型为type的所有的Bean的名字,注意是名字,而不是Bean对象,因为我们可以根据BeanDefinition就能判断和当前type是不是匹配,不用生成Bean对象把re…...
python的dataframe常用处理方法
import pandas as pdclass DataFrameProcessor:staticmethoddef sort_by_column(df, by_column, ascendingTrue):"""根据指定列对DataFrame进行排序。Parameters:df (pd.DataFrame): 要排序的DataFrame。by_column (str): 要排序的列名。ascending (bool): True…...
k8s 自身原理之高可用
说到高可用,咱们在使用主机环境的时候(非 k8s),咱做高可用有使用过这样的方式: 服务器做主备部署,当主节点和备节点同时存活的时候,只有主节点对外提供服务,备节点就等着主节点挂了…...
游乐场vr设备虚拟游乐园vr项目沉浸体验馆
在景区建设一个VR游乐场项目可以为游客提供一种新颖、刺激和沉浸式的游乐体验。提高游客的体验类型,以及景区的类目,从而可以吸引更多的人来体验。 1、市场调研:在决定建设VR游乐场项目之前,需要进行市场调研,了解当地…...
window10安装并使用oracle
1、现在oracle19c或者21c,下载链接如下 Database Software Downloads | Oracle 中国 2、安装好之后, 2.1PL/SQL连接方式 命令窗口输入sqlplus conn as sysdba 2.2DBeaver连接 输入IP、 端口默认1521 数据库默认是ORCL 用户名是system 角色是N…...
[Mac软件]AutoCAD 2024 for Mac(cad2024) v2024.3.61.182中文版支持M1/M2/intel
下载地址:前往黑果魏叔官网 AutoCAD是一款计算机辅助设计(CAD)软件,目前已经成为全球最受欢迎的CAD软件之一。它可以在二维和三维空间中创建精确的技术绘图,并且可以应用于各种行业,如建筑、土木工程、机械…...
Oracle 主从库目录不一致(异路径)的n种处理方案及效果
最近遇到了复制数据(DUPLICATE TARGET DATABASE TO xxx)的时候 Oracle 源和目标库目录不一致的问题,比较初级但也踩到一些坑,整理记录一下。主从库搭建的时候注意事项其实也类似,而且更通用,所以标题写的是…...
创建型(一) - 简单工厂模式、工厂方法模式和抽象工厂模式
本文使用了王争老师设计模式课程中的例子,写的很清晰,而且中间穿插了代码优化。 由于设计模式就是解决问题的一种思路,所以每个设计模式会从问题出发,这样比较好理解设计模式出现的意义。 一、简单工厂模式 解决问题:…...
LeetCode3.无重复字符的最长子串
虽然是一道中等题,但我5分钟就写完了,而且是看完题就知道怎么写,这一看就知道双指针,一个左一个右,右指针往后移如果没有重复的长度1;如果有重复的,左指针往右移,那如何判断重复呢&a…...
鲁图中大许少辉博士八一新书《乡村振兴战略下传统村落文化旅游设计》山东省图书馆典藏
鲁图中大许少辉博士八一新书《乡村振兴战略下传统村落文化旅游设计》山东省图书馆典藏...
如何发布自己的小程序
小程序的基础内容组件 text: 文本支持长按选中的效果 <text selectable>151535313511</text> rich-text: 把HTML字符串渲染为对应的UI <rich-text nodes"<h1 stylecolor:red;>123</h1>"></rich-text> 小程序的…...
【微服务】spring 条件注解从使用到源码分析详解
目录 一、前言 二、spring 条件注解概述 2.1 条件注解Conditional介绍 2.2 Conditional扩展注解 2.2.1 Conditional扩展注解汇总 三、spring 条件注解案例演示 3.1 ConditionalOnBean 3.2 ConditionalOnMissingBean 3.2.1 使用在类上 3.2.2 使用场景补充 3.3 Condit…...
客户案例:高性能、大规模、高可靠的AIGC承载网络
客户是一家AIGC领域的公司,他们通过构建一套完整的内容生产系统,革新内容创作过程,让用户以更低成本完成内容创作。 客户网络需求汇总 RoCE的计算网络RoCE存储网络1.不少于600端口200G以太网接入端口,未来可扩容至至少1280端口1.…...
Flutter性能揭秘之RepaintBoundary
作者:xuyisheng Flutter会在屏幕上绘制Widget。如果一个Widget的内容需要更新,那就只能重绘了。尽管如此,Flutter同样会重新绘制一些Widget,而这些Widget的内容仍有部分未被改变。这可能会影响应用程序的执行性能,有时…...
29.Netty源码之服务端启动:创建EventLoopSelector流程
highlight: arduino-light 源码篇:从 Linux 出发深入剖析服务端启动流程 通过前几章课程的学习,我们已经对 Netty 的技术思想和基本原理有了初步的认识,从今天这节课开始我们将正式进入 Netty 核心源码学习的课程。希望能够通过源码解析的方式…...
Kotllin实现ArrayList的基本功能
前言 上次面试时,手写ArrayList竟然翻车,忘了里面的扩容与缩容的条件,再次实现一次,加深印象 源码讲了什么 实现了List列表和RandomAccess随机访问接口List具有增删改查功能,RandomAccess支持下标访问内部是一个扩容…...
C++的初步介绍,以及C++与C的区别
C和C的区别 C又称C plus plus,且C语言是对C语言的扩充,几乎支持所有的C语言语法;C语言:面向过程的语言(注重问题的解决方法和算法)C:面向对象的语言 (求解的方法)面向对…...
JDK 核心jar之 rt.jar
一、JDK目录展示 二、rt.jar 简介 2.1.JAR释义 在软件领域,JAR文件(Java归档,英语:Java Archive)是一种软件包文件格式,通常用于聚合大量的Java类文件、相关的元数据和资源(文本、图片等&…...
el-form表单验证:只在点击保存时校验(包含select、checkbox、radio)
1、input类型 input类型 在el-input里加入:validate-event"false" <el-form-item label"活动名称" prop"name"><el-input v-model"ruleForm.name" :validate-event"false"></el-input> </el-form-i…...
Golang基本语法(上)
1. 变量与常量 Golang 中的标识符与关键字 标识符 Go语言中标识符由字母数字和_(下划线)组成,并且只能以字母和_开头。 举几个例子:abc, _, _123, a123。 关键字 关键字和保留字都不建议用作变量名: Go语言中有25个关键字。 此…...
开发公司采购招聘/seo关键词分析
最近有个概念吵得很火,网络爬虫,但是基本都是用什么python或者JAVA写,貌似很少看到用c写的,我在网上找了一个,看到其实还是很简单的算法。 算法讲解:1.遍历资源网站 2.获取html信息 3.然后解析网址和图片…...
做网站的广告图片/百度广告投放平台叫什么
Example002 题目 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针,请写出相应的入队列和出队列的算法。 分析 注意,这里的不设头指针的意思是不设定队头指针。 我们设 rear 为带头结点的循环链…...
wordpress主题转换/目前网络推广平台
1. 剑指 Offer 22. 链表中倒数第k个节点 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的…...
wordpress评轮审核/网络营销和网络推广有什么区别
点击查看全文 当今时代很多吃瓜群众对程序员的印象都是 而程序员的真实情况却是这样:每天大部分时间都在改代码,写代码,看代码才是我们真实的工作日常,到底每天要写多少行才是好程序员呢? 为了探讨这个问题首先要了解程…...
做兼职网站赚钱吗/百度一下百度搜索官网
从接触thinkphp到今天,填完此坑,必有其他的坑有会冒出来。哎!这个填坑之路我想是没有尽头的了。 最近,需要使用ajax完成一些操作,一开始想Ajax简单啊,不过是一种提交数据的方式,不过是害苦了我。…...
郑州网站如何制作/做网站推广好做吗
SMS主站点配置、客户端发现及客户端安装杜 飞当我们部署好SMS服务器以后,我们就要让它发挥它的作用来为我们提供服务,但还需要对它进行相应的配置,所以这篇博文主要讨论以下几个方面的内容:1. SMS主站点的配置2. 配置S…...