这是我参与「第五届青训营」伴学笔记创作活动的第14天。
前言
前文介绍了视频投稿接口中储存文件至本地的实现,今天仍然说说视频投稿接口,有关于视频播放地址的问题。
参数路由
Hertz 支持使用 :name 这样的命名参数设置路由,并且命名参数只匹配单个路径段。
如果我们设置/user/:name路由,他将会自动匹配:
/user/a
/user/b
通过使用 RequestContext.Param 方法,我们可以获取路由中携带的参数。
func main(){
h := server.Default(server.WithHostPorts("127.0.0.1:8080"))
h.GET("/user/:version", func(ctx context.Context, c *app.RequestContext) {
version := c.Param("version")
c.String(consts.StatusOK, "Hello %s", version)
})
h.Spin()
}
通过参数路由,我们可以实现视频的播放地址。
视频播放地址
首先我们需要使用ksuid包来生成一个随机字符串来作为储存文件的名字。
filename := ksuid.New().String()
filePath := path.Join("video", filename+".mp4")//如果你存放的是视频且想能在本地观看可以这样写
此处,我们的视频播放地址即为我们注册的路由名加文件名
url := "http://localhost:8080/douyin/publish/action/" + filename
然后我们需要注册参数路由,并使用Param方法提取参数,并将对应路径中的文件转换为文件流,随后返回响应。
publishGroup.POST("/action/:filename", func(c context.Context, ctx *app.RequestContext) {
filename := ctx.Param("filename")
filePath := path.Join("video", filename+".mp4")
filestream, err := os.ReadFile(filePath)
if err != nil {
//返回错误响应
return
}
ctx.Write(filestream)
})
首先根据我们的视频地址,注册一个随文件名不同而不同的参数路由。
我们使用Param方法提取参数路由传入的参数,随后使用path包的Join方法,创建一个文件路径。再使用os包的ReadFile方法,将对应的文件转换为一个文件流,并对其做错误处理,防止转换失败。
app包的Write方法可以实现返回一个文件流响应。
此时基本实现视频播放地址,并确保地址确实有效。