我最近更改了项目的文件结构,现在我似乎无法正确加载我的html文件。
我已经按照这个类似主题的几个不同答案的建议无济于事。
关于文件结构,getIndexPageHandler
位于src/controllers/index.go
且index.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)
}
答案 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"