视频保存功能 | 青训营笔记

90 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天。

在大作业实现的过程中,我们需要实现的一个功能是获取用户上传的视频,然后持久化到数据库中,在此对该功能的实现思路做一个总结。

1. 获取token里的用户信息

之前的笔记中我们使用了jwt生成了token,其中用来生成token的数据中有用户信息。而现在我们观察用户上传视频的请求:

curl --location --request POST '/douyin/publish/action/' \
--header 'User-Agent: Apifox/1.0.0 (https://www.apifox.cn)' \
--form 'data=@""' \
--form 'token=""' \
--form 'title=""'

我们发现和获取用户信息的接口不同,该接口中只包含token用于识别用户信息,这意味着我们需要解析token里的用户信息。在学习过程中,找到了如下的功能实现用于生成token和解析token,可供学习:

type MyCustomClaims struct {
	Username string `json:"username"`
	jwt.StandardClaims
}
auth := c.Request.Header.Get("Authorization")
if auth == "" {
	c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"Message": "Authorization Header Not Found"})
	return
}
splitToken := strings.Split(auth, "Bearer ")
auth = splitToken[1]
token, err := jwt.ParseWithClaims(auth, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
	return []byte("AccessToken"), nil
})
if err != nil {
	c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"Message": "Token is wrong or Expire"})
	return
}
if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
	log.Printf("%v %v", claims.Username, claims.StandardClaims.ExpiresAt)
}

2. 视频上传保存

首先我们需要从发送的form中提取出需要的信息

token := c.PostForm("token")
title := c.PostForm("title")
file := c.PostForm("data")

然后我们需要从file中获取文件格式,然后通过用户id和生成文件名、使用FFmpeg获取封面,最后持久化进数据库。

	suffix := filepath.Ext(file.Filename)
	videoName := GetVideoName(user_id)
	savePath := filepath.Join("./video", videoName)
	err = Save_video(file, savePath)
	err = GetVideoCover(name, true)
	err = InsertVideo(userId, videoName, savePath, title)

以上代码仅为思路参考,具体的实现过程需要进一步的完善。

在学习实现相关功能的过程中,接触到了很多新知识,也对进一步巩固了对框架的使用,希望爆肝能赶得上ddl。