【问题标题】:No such file or directory error in golanggolang中没有这样的文件或目录错误
【发布时间】:2016-07-07 06:27:49
【问题描述】:

我想在我的一个 golang 控制器中指定一个 html 模板 我的目录结构是这样的

 Project
 -com
  -src
   - controller
     -contoller.go
 -view
  - html
   -first.html

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

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

请帮助我消除此错误。提前致谢

【问题讨论】:

标签: go


【解决方案1】:

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

package htmltemplates

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

在我删除的 NewHandler 方法中 //Templates用来存放所有的Template var 模板 *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)

它现在可以工作了。但是如果有的话,需要一个更好的解决方案

【讨论】:

    【解决方案2】:

    你在main函数中加入了这一行吗?

    http.Handle("/view/", http.StripPrefix("/view/", http.FileServer(http.Dir("view"))))
    

    view 是必须在 FileServer 函数中指定以允许读/写的目录名称。(view 目录必须保存在您的二进制文件所在的同一目录中)

    【讨论】:

    • 是的。 router.Handle("/", http.FileServer(http.Dir("./view/")))
    • 路由器是多路复用路由器
    • 通过提供绝对路径解决的问题。但需要一个更好的解决方案,如果有的话
    • @AkhilSudhakaran 如果您不想使用绝对路径,可以选择以下选项:options
    • 我一直在使用相对路径,它工作正常。问题必须是仅访问目录(如 /view 或 ./view 等)。您可以通过以下方式检查:启动服务器,然后尝试从浏览器访问视图文件夹,例如键入 localhost:8080/view 应该会显示可用文件列表。谢谢@icza,不错的选择。
    【解决方案3】:

    更好的解决方案是给出绝对路径名,即代替这个“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, "")
        }
    

    【讨论】:

      【解决方案4】:

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

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

      2. 上面的 sn-p 将返回您的程序试图查找文件的路径。 像 D:\Golang_Projects\POC\Distributed_Application_Go\cmd\teacherportal

      3. 确定程序正在查看的路径后,使用“..”离开该目录。喜欢,

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

      也有替代解决方案,但我发现这很容易实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-19
        • 2021-10-31
        • 1970-01-01
        • 2014-08-14
        • 2015-05-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多