Go Golang提供特定的html文件

时间:2014-09-20 05:21:41

标签: http go

http.Handle("/", http.FileServer(http.Dir("static")))

html文件提供给静态目录。

Go中是否有任何方法可以指定要提供的html文件?

render_template

中的Flask之类的内容

我想做类似的事情:

http.Handle("/hello", http.FileServer(http.Dir("static/hello.html")))

3 个答案:

答案 0 :(得分:37)

使用custom http.HandlerFunc可能会更容易:

除了您的情况,您的func将是http.ServeFile,仅用于提供一个文件。

请参阅“Go Web Applications: Serving Static Files”:

  

在您的归属处理程序下面添加以下内容(见下文):

http.HandleFunc("/static/", func(w http.ResponseWriter, r *http.Request) {
    http.ServeFile(w, r, r.URL.Path[1:])
})
  

这是使用net/http包的ServeFile功能来提供我们的内容   有效地,任何以/static/路径开头的请求都将由此函数处理   我发现为了正确处理请求我必须做的一件事是使用以下方法修改前导'/':

r.URL.Path[1:]

实际上,不要这样做 在Go 1.6中,sztanpet commentscommit 9b67a5d无法实现这一点:

  

如果提供的文件或目录名是相对路径,则为   相对于当前目录解释,可以提升为父目录   目录即可。
  如果提供的名称是根据用户输入构建的,则应在调用ServeFile之前对其进行清理   作为预防措施,ServeFile将拒绝r.URL.Path包含“..”路径元素的请求。

这将防止以下“网址”:

/../file
/..
/../
/../foo
/..\\foo
/file/a
/file/a..
/file/a/..
/file/a\\..

答案 1 :(得分:2)

您可以使用http.StripPrefix

像这样:

http.Handle("/hello/", http.StripPrefix("/hello/",http.FileServer(http.Dir("static"))))

答案 2 :(得分:1)

也许我在这里错过了一些东西,但经过很多困惑的搜索,我把它放在一起:

...

func downloadHandler(w http.ResponseWriter, r *http.Request) {
        r.ParseForm()
        StoredAs := r.Form.Get("StoredAs") // file name
        data, err := ioutil.ReadFile("files/"+StoredAs)
        if err != nil { fmt.Fprint(w, err) }
        http.ServeContent(w, r, StoredAs, time.Now(),   bytes.NewReader(data))
}

...

在一个简单的上传和下载服务器中调用downloadHandler的地方:

func main() {
              http.HandleFunc("/upload", uploadHandler)
              http.HandleFunc("/download", downloadHandler)
              http.ListenAndServe(":3001", nil)
}   

适用于Firefox和Chrome。甚至不需要文件类型。