我刚开始在较小的项目中使用 chi,我很好奇这里是如何处理静态文件服务的。完成它的最短方法是什么?
这是我尝试的文件服务
fs := http.FileServer(http.Dir("static"))
router.Handle("/static", http.StripPrefix("/static/", fs))
然而,这不起作用,所以我直接从他们的仓库中尝试了这个例子:
func fileServer(r chi.Router, serverRoute string, pathToStaticFolder http.FileSystem) {
if strings.ContainsAny(serverRoute, "{}*") {
panic("FileServer does not permit any URL parameters.")
}
if serverRoute != "/" && serverRoute[len(serverRoute)-1] != '/' {
r.Get(serverRoute, http.RedirectHandler(serverRoute+"/", 301).ServeHTTP)
serverRoute += "/"
}
serverRoute += "*"
r.Get(serverRoute, func(w http.ResponseWriter, r *http.Request) {
rctx := chi.RouteContext(r.Context())
serverRoutePrefix := strings.TrimSuffix(rctx.RoutePattern(), "/*")
fs := http.StripPrefix(serverRoutePrefix, http.FileServer(pathToStaticFolder))
fs.ServeHTTP(w, r)
})
}
dir, _ := os.Getwd()
filesDir := http.Dir(filepath.Join(dir, "static"))
fileServer(router, "/", filesDir)
不幸的是,这两种方法都不起作用,我目前不知所措。任何曾经使用 Chi 作为路由器的人,你如何提供静态文件?
这是我的文件夹结构
project
|_ main.go
|_ static
|_css
|_index.css
|_img
|_js
答案 0 :(得分:5)
您应该修改路由器中注册的路径为
router.Handle("/static/*", http.StripPrefix("/static/", fs))
*
代表不同的文件名。