首页 > 解决方案 > 在 gin 中使用 go-assets 的示例

问题描述

我想为 go-app 提供一个二进制文件,而不是在部署时捆绑静态文件。

我正在使用这样的函数来访问我正在加载的 PNG:

func getFileList(dir string) (fileList []os.FileInfo, err error) {
    // USAGE: 
    //    fileList,_ := getFileList(PNG_DIR)
    f, err := os.Open(PNG_DIR)
    defer f.Close()
    checkErr(err)
    fileList, err = f.Readdir(0)
    checkErr(err)
    return fileList, err
}

我使用这个文件列表并将其提供给静态端点,并带有一些逻辑。

我已阅读以下有关使用 go-assets 的文档

以及这个杜松子酒的具体例子:

其中包含以下示例:

准备包裹

去获取 github.com/gin-gonic/gin 去获取 github.com/jessevdk/go-assets-builder

生成 assets.go

go-assets-builder html -o assets.go

构建服务器

go build -o assets-in-binary

./assets-in-binary

但是,我不清楚如何调用我构建的这个文件。例如,我要在我的getFileList()函数中更改什么以指向我在二进制文件中构建的任何内容,它甚至被称为什么,我怎么知道?

标签: goassetsgo-gin

解决方案


通常在 gin 上你会使用,router.Statuc(path, dir)但是你说你首先加载一个文件列表,我猜你稍后会使用http.ServeFile.

有了go-bindata可执行文件中已经存在的所有文件,您可以使用该Asset(file)函数访问它们...

基本上这是一个非常简单的 gin 静态处理程序:

func StaticHandler(c *gin.Context) {
      p := c.Param("filepath")
      data, err := Assets(p)
      if err != nil { return }
      c.Writer.Write(data)
}

您可以将静态处理程序注册到路由器中:

router.GET("/static/*filepath", StaticHandler)

这允许通过以下方式访问静态资源:/static/css/style.css并将加载文件css/style.css

您可以获取文件夹中的文件列表,创建地图并将该地图用于静态处理程序(以限制访问哪些文件)


推荐阅读