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

news/2024/7/8 0:27:21

文章目录

  • 安装
  • 获取凭证
  • 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.Data
	var 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.Data
	VideoUrl, 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 secretkey
	AccessKey = your accesskey
	Bucket = your bucket
	Domain = your domain
    
	size := int64(len(data))
    //也可以用时间戳,这里用的uuid
	key := 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 = StatusCode
	res.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://lihuaxi.xjx100.cn/news/1465260.html

相关文章

2023前端面试笔记 —— HTML5(持续收集更新)

系列文章目录 内容链接2023前端面试笔记HTML5 文章目录 系列文章目录前言一、HTML 文件中的 DOCTYPE 是什么作用二、HTML、XML、XHTML 之间有什么区别三、前缀为 data- 开头的元素属性是什么四、谈谈你对 HTML 语义化的理解五、HTML5 对比 HTML4 有哪些不同之处六、meta 标签有…

【C++随笔01】联合体union —— 一种节省空间的类

【C随笔01】联合体union —— 一种节省空间的类 一、联合体(union)二、定义三、用法1、定义union、访问union成员2、匿名union3、使用类管理union成员4、管理并销毁string 一、联合体(union) 联合体是一种特殊的类。一个union可以有多个数据成员&#x…

茂名 湛江阳江某学校 ibm x3850服务器维修经历

简介:中国广东省阳江市某中学联想 IBM System x3850 x6服务器维修 io板故障处理经历分享: 这一天一位阳江的老师经其他学校老师介绍推荐对接我,说他们学校有一台ibm服务器出问题了,老师大致跟我描述了一下这台服务器发生故障的前…

5.7.webrtc线程的启动与运行

那在上一节课中呢?我向你介绍了web rtc的三大线程,包括了信令线程,工作线程以及网络线程。那同时呢,我们知道了web rtc 3大线程创建的位置以及运行的时机。 对吧,那么今天呢?我们再继续深入了解一下&#…

AUTOSAR规范与ECU软件开发(实践篇)4.4 软件组件代码及描述文件配置生成(下)

目录 4、Simulink-AUTOSAR Mapping配置 (1) Inports/Outports (2) Entry Point Functions (3) Function Callers (4) Data Transfers</

LLM提示词工程和提示词工程师Prompting and prompt engineering

你输入模型的文本被称为提示&#xff0c;生成文本的行为被称为推断&#xff0c;输出文本被称为完成。用于提示的文本或可用的内存的全部量被称为上下文窗口。尽管这里的示例显示模型表现良好&#xff0c;但你经常会遇到模型在第一次尝试时无法产生你想要的结果的情况。你可能需…

语法篇--XML数据传输格式

一、XML概述 1.1简介 XML&#xff0c;全称为Extensible Markup Language&#xff0c;即可扩展标记语言&#xff0c;是一种用于存储和传输数据的文本格式。它是由W3C&#xff08;万维网联盟&#xff09;推荐的标准&#xff0c;广泛应用于各种系统中&#xff0c;如Web服务、数据…

图床项目进度(一)——UI首页

1. 前言 前面我不是说了要做一个图床吗&#xff0c;现在在做ui。 我vue水平不够高&#xff0c;大部分参考b站项目照猫画虎。 vue实战后台 我使用ts&#xff0c;vite&#xff0c;vue3进行了重构。 当然&#xff0c;我对这些理解并不深刻&#xff0c;许多代码都是游离于表面&am…