无法从其他文件夹中找到html文件

时间:2017-11-18 20:04:08

标签: go

我最近更改了项目的文件结构,现在我似乎无法正确加载我的html文件。

我已经按照这个类似主题的几个不同答案的建议无济于事。

关于文件结构,getIndexPageHandler位于src/controllers/index.goindex.html位于src/views/index.html

此外,当我使用fmt.Println(filepath.Join(cwd, "./views/index.html"))时,它会返回C:\Projects\Go\src\views\index.html

这让我感到困惑,那是文件的直接路径,为什么它告诉我每当我尝试导航时都找不到index.html?此外,我没有发布在/index路由上调用此路由器的路由器,但是当html文件与我的控制器文件位于同一目录之前,这个确切的代码块工作正常,所以我相信错误在于此块。

func getIndexPageHandler(w http.ResponseWriter, r *http.Request) {
    cwd, err := os.Getwd()

    utils.CheckErr(err)

    template, err := template.ParseFiles(filepath.Join(cwd, "./views/index.html"), filepath.Join(cwd, "./views/header.html"))

    utils.CheckErr(err)

    w.Header().Set("Content-Type", "text/html; charset=utf-8")

    err = template.ExecuteTemplate(w, filepath.Join(cwd, "./views/index.html"), nil)

    utils.CheckErr(err)
}

2 个答案:

答案 0 :(得分:1)

问题的第一部分是您正在使用ParseFiles,它使用第一个文件的 base 名称来设置返回的*template.Template的名称。

来自文档:

  

ParseFiles创建一个新模板并解析模板定义   来自命名文件。返回的模板名称将具有   (基础)第一个文件的名称和(已解析)内容。

第二部分是你使用ExecuteTemplate传递完整路径作为第二个参数,而文档说它的第二个参数应该是要执行的模板的名称

文档:

  

ExecuteTemplate应用与t相关联的模板   给定指定数据对象的名称并将输出写入wr。

有几种解决方法:

// the name of t becomes the base of first file, which is "index.html"
t, err := template.ParseFiles(filepath.Join(cwd, "./views/index.html"), filepath.Join(cwd, "./views/header.html"))
utils.CheckErr(err)
w.Header().Set("Content-Type", "text/html; charset=utf-8")
// use the base name of the first file from ParseFiles
err = t.ExecuteTemplate(w, "index.html", nil)
utils.CheckErr(err)

或者

// specify desired name using New
t, err := template.New("my_template").ParseFiles(filepath.Join(cwd, "./views/index.html"), filepath.Join(cwd, "./views/header.html"))
utils.CheckErr(err)
w.Header().Set("Content-Type", "text/html; charset=utf-8")
// use the name specified with New
err = t.ExecuteTemplate(w, "my_template", nil)
utils.CheckErr(err)

或者

// don't care about name because we'll use Execute instead of ExecuteTemplate
t, err := template.ParseFiles(filepath.Join(cwd, "./views/index.html"), filepath.Join(cwd, "./views/header.html"))
utils.CheckErr(err)
w.Header().Set("Content-Type", "text/html; charset=utf-8")
// call Execute
err = t.Execute(w, nil)
utils.CheckErr(err)

了解更多:

答案 1 :(得分:0)

您需要使用两个点,用于一个目录。

"../views/index.html"