在golang中出现“没有此文件或目录”的错误

8
我想在我的 Golang 控制器中指定一个 HTML 模板。我的目录结构如下:
 Project
 -com
  -src
   - controller
     -contoller.go
 -view
  - html
   -first.html

我希望在请求 /new 时加载 first.html。我已经为 url /new 使用了 NewHandler,并且当 /new 请求到来时,NewHandler 函数会在 controller.go 中执行。以下是我的代码:

func NewHandler(w http.ResponseWriter, r *http.Request) {
    t, err := template.ParseFiles("view/html/first.html")
    if err == nil {
        log.Println("Template parsed successfully....")
    }
 err := templates.ExecuteTemplate(w, "view/html/first.html", nil)
if err != nil {
    log.Println("Not Found template")
}
//  t.Execute(w, "")
}

但是我遇到了一个错误。
     panic: open first.html: no such file or directory

请帮我解决这个错误。提前感谢您。

4个回答

9

我通过给出HTML的绝对路径解决了这个问题。为此,我创建了一个类来解析HTML。

package htmltemplates

import (
"html/template"
"path/filepath"
)

在NewHandler方法中,我删除了//Templates is used to store all Templates这行代码。现在的代码如下:var Templates *template.Template
func init() {
filePrefix, _ := filepath.Abs("./work/src/Project/view/html/")       // path from the working directory
Templates = template.Must(template.ParseFiles(filePrefix + "/first.html")) 
...
//htmls must be specified here to parse it
}

在NewHandler中,我删除了前5行,并改为给出以下内容。
err := htmltemplates.Templates.ExecuteTemplate(w, "first.html", nil)

目前它正在工作。但如果有更好的解决方案,需要进行改进。


1
你在主函数中包含了这行代码吗?
http.Handle("/view/", http.StripPrefix("/view/", http.FileServer(http.Dir("view"))))

view是在FileServer函数中必须指定的目录名称,以允许读写。(视图目录必须保留在与二进制文件相同的目录中)


router.Handle("/", http.FileServer(http.Dir("./view/"))) - Akhil Sudhakaran
路由器是一个多路复用路由器。 - Akhil Sudhakaran
问题通过提供绝对路径得到解决。但如果有更好的解决方案,还需要进一步改进。 - Akhil Sudhakaran
@AkhilSudhakaran 如果您不想使用绝对路径,以下是您的选项:options - icza
我一直只使用相对路径,它运行良好。问题必须在访问目录上(如/view或./view等)。您可以通过以下方式进行检查:启动服务器,然后尝试从浏览器访问视图文件夹,例如键入localhost:8080/view应该显示可用文件列表。感谢@icza,提供了很好的替代方案。 - ganesh kumar

0

解决方案,我只是遍历目录而没有使用库来查找路径或转换它们。

  1. 使用 "os" 包获取当前工作目录。例如, import( "os" ) your_function(){ pwd,_ := os.pwd()}

  2. 上面的代码段将返回您的程序正在尝试查找文件的路径。 例如 D:\Golang_Projects\POC\Distributed_Application_Go\cmd\teacherportal

  3. 确定程序正在查找的路径后,使用 ".." 来退出该目录。例如,

    rootTemplate,err := template.ParseFiles("../../teacherportal/students.gohtml")

还有其他替代方案,但我发现这种方法非常简单易行。


0
更好的解决方案是提供绝对路径名,即不要使用 "view/html/first.html",而是尝试使用。
 func NewHandler(w http.ResponseWriter, r *http.Request) {
        t, err := template.ParseFiles("./work/src/Project/view/html/first.html")
        if err == nil {
            log.Println("Template parsed successfully....")
        }
     err := templates.ExecuteTemplate(w, "view/html/first.html", nil)
    if err != nil {
        log.Println("Not Found template")
    }
    //  t.Execute(w, "")
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接