这是我参与「第五届青训营 」伴学笔记创作活动的第 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。