将gin.Dir 与listDirectory == false 一起使用。 它也适用于子目录。
Dir 返回一个可供 http.FileServer() 使用的 http.Filesystem。它在 router.Static() 内部使用。如果 listDirectory == true,那么它的工作方式与 http.Dir() 相同,否则它返回一个阻止 http.FileServer() 列出目录文件的文件系统。
示例用法:
本地文件系统
/
|_ static
|_ 1
|_ foo.jpg
|_ bar.jpg
|_ main.go
|_ go.mod
|_ go.sum
main.go
r := gin.New()
r.StaticFS("/foo", gin.Dir("static", false))
HTTP 请求
GET: <host:port>/foo/1/foo.jpg
作为替代方案,您还可以使用路径参数声明路由,并提供内容:
r.GET("/media/:dir/*asset", func(c *gin.Context) {
dir := c.Param("dir")
asset := c.Param("asset")
if strings.TrimPrefix(asset, "/") == "" {
c.AbortWithStatus(http.StatusNotFound)
return
}
fullName := filepath.Join(dir, filepath.FromSlash(path.Clean("/"+asset)))
c.File(fullName)
})
通过检查修剪后的通配符路径 *asset 是否为空,您可以阻止查询,例如/media/1/(带有最后的斜杠)列出目录。相反,/media/1(没有最后的斜线)不匹配任何路由(它应该自动重定向到/media/1/)。