当前位置: 首页 > 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…...

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

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

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...