编程初学者的Go语言学习之旅 | 青训营笔记

94 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第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方法可以实现返回一个文件流响应。
此时基本实现视频播放地址,并确保地址确实有效。