当前位置: 首页 > news >正文

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 函数:生成唯一标识符,通常用于生成上传文件的唯一键。

相关文章:

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 源和目标库目录不一致的问题,比较初级但也踩到一些坑,整理记录一下。主从库搭建的时候注意事项其实也类似,而且更通用,所以标题写的是…...

创建型(一) - 简单工厂模式、工厂方法模式和抽象工厂模式

本文使用了王争老师设计模式课程中的例子,写的很清晰,而且中间穿插了代码优化。 由于设计模式就是解决问题的一种思路,所以每个设计模式会从问题出发,这样比较好理解设计模式出现的意义。 一、简单工厂模式 解决问题&#xff1a…...

LeetCode3.无重复字符的最长子串

虽然是一道中等题,但我5分钟就写完了,而且是看完题就知道怎么写,这一看就知道双指针,一个左一个右,右指针往后移如果没有重复的长度1;如果有重复的,左指针往右移,那如何判断重复呢&a…...

鲁图中大许少辉博士八一新书《乡村振兴战略下传统村落文化旅游设计》山东省图书馆典藏

鲁图中大许少辉博士八一新书《乡村振兴战略下传统村落文化旅游设计》山东省图书馆典藏...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...