1 回答
TA贡献1900条经验 获得超5个赞
根据评论,您遇到的主要问题是您正在从文件系统(而不是嵌入式文件系统)提供服务,并且该文件不存在于其中。index.html
第二个问题是嵌入式文件系统将包含单个目录,因此您需要使用类似的东西才能工作(否则您将需要 - 这适用于您的以及提供索引时.html)。statics, err := fs.Sub(static, "static")s.Open("index.html")static.Open("static/index.html")http.FileServer
注意:您可能不需要以下内容,因为您可以只为路径运行(因此它提供服务以及子目录中的文件)。 如果 url 中未提供文件名,则会自动提供服务。http.FileServer/index.htmlhttp.FileServerindex.html
要从嵌入式文件系统中提供服务,您可以将函数重写为(未经测试!index.html
// default/root handler which serves the index page and associated styling
func indexHandler(w http.ResponseWriter, r *http.Request) {
f, err := s.Open("index.html") // Using `s` from above and assumes its global; better to use handlerfunc and pass filesystem in
if err != nil {
// Send whatever error you want (as file is embedded open should never fail)
return
}
defer f.Close()
w.Header().Set("Content-Type", "text/html")
if _, err := io.Copy(w, f); err != nil { // Write out the file
// Handle error
}
}
上面依赖于一个全局变量(我不热衷于它),所以我会把它转换成这样的东西:
func IndexHandlerFunc(fs fs.FS, h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
f, err := fs.Open("index.html")
if err != nil {
// Send whatever error you want (as file is embedded open should never fail)
return
}
defer f.Close()
w.Header().Set("Content-Type", "text/html")
if _, err := io.Copy(w, f); err != nil { // Write out the file
// Handle error
}
})
}
- 1 回答
- 0 关注
- 119 浏览
添加回答
举报