为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Golang 来提供特定的 html 文件

使用 Golang 来提供特定的 html 文件

Go
函数式编程 2021-08-16 19:23:06
http.Handle("/", http.FileServer(http.Dir("static")))提供html静态目录中的文件。在 Go 中有什么方法可以指定html要提供的文件吗?像render_template在Flask我想做类似的事情:http.Handle("/hello", http.FileServer(http.Dir("static/hello.html")))
查看完整描述

3 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

也许使用自定义http.HandlerFunc会更容易:


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


参见例如“ Go Web Applications:Serving Static Files ”:


在您的家庭处理程序下方添加以下内容 (见下文):


http.HandleFunc("/static/", func(w http.ResponseWriter, r *http.Request) {

   // do NOT do this. (see below)

    http.ServeFile(w, r, r.URL.Path[1:])

})

这是使用net/http包的 ServeFile 函数来提供我们的内容。

实际上,任何以/static/路径开头的请求都将由该函数处理。

我发现为了正确处理请求我必须做的一件事是使用以下方法修剪前导“/”:


r.URL.Path[1:]

实际上,不要这样做。

这在 Go 1.6 中是不可能的,正如sztanpet 评论的那样,提交 9b67a5d:


如果提供的文件或目录名称是相对路径,则它相对于当前目录进行解释,并可能上升到父目录。

如果提供的名称是根据用户输入构造的,则应在调用ServeFile.

作为预防措施,ServeFile将拒绝r.URL.Path包含“ ..”路径元素的请求。


这将防止以下“网址”:


/../file

/..

/../

/../foo

/..\\foo

/file/a

/file/a..

/file/a/..

/file/a\\..


查看完整回答
反对 回复 2021-08-16
?
波斯汪

TA贡献1811条经验 获得超4个赞

你可以用 http.StripPrefix

像这样:

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


查看完整回答
反对 回复 2021-08-16
?
白衣非少年

TA贡献1155条经验 获得超0个赞

也许我在这里遗漏了一些东西,但经过大量混乱的搜索,我把它放在一起:


...


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。甚至不需要文件类型。


查看完整回答
反对 回复 2021-08-16
  • 3 回答
  • 0 关注
  • 237 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信