这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
今日进度
今天写了一天的接口,昨天在token那里困住了,今天终于解决了,但是在写接口的时候也遇到了很多问题:
- 怎么把客户端传过来的视频流转换并且保存在本地?
解决方案:(1) 首先,将客户端传过来的视频流转换成流媒体格式,可以使用ffmpeg等视频流媒体转换器转换成流媒体格式,如rtmp、hls等; (2) 然后,使用ffmpeg等视频流媒体服务器解析流媒体格式,将视频流存储到本地文件中; (3) 最后,使用ffmpeg等视频格式转换器将本地文件转换成需要的视频格式,并将视频保存到本地。
// 获取上传的文件
file, err := c.FormFile("data")
if err != nil {
c.JSON(http.StatusOK, Response{
StatusCode: 1,
StatusMsg: "获取上传的文件 error",
})
return
}
// 读取文件数据
fileBytes, err := file.Open()
if err != nil {
c.JSON(http.StatusOK, Response{
StatusCode: 1,
StatusMsg: "读取文件数据 error",
})
return
}
defer fileBytes.Close()
// 获取当前的工作目录
wd, err := os.Getwd()
if err != nil {
c.JSON(http.StatusOK, Response{
StatusCode: 1,
StatusMsg: err.Error(),
})
return
}
// 存储到本地 ?? 更改filename
filePath := wd + "/public/video/" + file.Filename
playurl := SeverIp + ":8080" + "/static/video/" + file.Filename
fmt.Println("playurl: ", playurl)
outFile, err := os.Create(filePath)
if err != nil {
c.JSON(http.StatusOK, Response{
StatusCode: 1,
StatusMsg: err.Error(),
})
return
}
defer outFile.Close()
_, err = io.Copy(outFile, fileBytes)
if err != nil {
c.JSON(http.StatusOK, Response{
StatusCode: 1,
StatusMsg: "io.Copy error",
})
return
}
- type存在嵌套字段,在需要返回该type类型时应该怎么解决?(比如说在video里面嵌套着一个user)
解决方案:在调用mysql存储函数的返回字段添加一个userid,然后每一次都根据userid进行查询userinfo,再把查询到的user丢进对应的type字段里面。
// 补充user
for id, _ := range commentsList {
var user User
err = dal.DB.Raw("CALL user_info(?)", commentsList[id].Userid).Scan(&user).Error
if err != nil {
c.JSON(http.StatusOK, VideoListResponse{
Response: Response{StatusCode: 1, StatusMsg: "User doesn't exist"},
})
return
}
commentsList[id].User = user
}
- 新增了userid字段,但是我返回的时候不想让它映射怎么办?
解决方案:在type对应字段后面加入“gorm-”
type Comment struct {
Id int64 `json:"id,omitempty"`
User User `json:"user" gorm:"-"`
Content string `json:"content,omitempty"`
CreateDate string
Userid int64 `json:"-"`
}
虽然接口已经初步完成了,但是在测试的时候还存在很多的问题,比如说有的时候视频就播放不了了;调用的存储过程明明就没有,但是它又没有报错;安卓模拟器有时候会卡bug等等。
明日需解决的问题
- 在上传视频部分有一个视频封面,但是客户端没有上传过来,需要通过截取视频的第一帧作为封面
- 一些基础的安全问题,包括但不止笔填字段非空
- 防止sql注入
- 上传视频的名字需要修改,通过添加随机数或者跟id绑定等办法(当名字相同的视频先后上传时,后面的视频会将前面的覆盖掉)