【问题标题】:How to serve files from dynamic subdirectories using Gin?如何使用 Gin 从动态子目录中提供文件?
【发布时间】:2021-09-04 17:13:44
【问题描述】:

我的目录结构如下:

- uploads
    - rooms
        - 1
            - a.jpg
            - b.jpg
        - 2
            - a.jpg
            - c.jpg

rooms 目录 (1, 2, ...) 中的子目录是动态添加的。我想在Gin 中创建一个端点,它可以在给定确切路径但不公开文件/文件夹列表时提供所有这些文件。

例如, http://localhost:8080/media/1/a.jpg 应该返回一个图像。但是http://localhost:8080/media/1 应该返回 404。

【问题讨论】:

    标签: go go-gin


    【解决方案1】:

    gin.DirlistDirectory == 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/)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      • 2017-08-31
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多