英文:
Multiple static files directories
问题
在Go语言中,我们可以通过将文件夹定义为静态文件目录来处理静态文件,如下所示:
fs := http.FileServer(http.Dir("./static/"))
http.Handle("/files/", fs)
其中,静态文件夹static
应该与二进制文件放在一起。
另一种方法是使用新的//go embed
,如下所示:
//go:embed static
var staticFiles embed.FS
// 使用http.FS创建http文件系统
var staticFS = http.FS(staticFiles)
fs := http.FileServer(staticFS) // 嵌入的静态文件
// 服务静态文件
http.Handle("/static/", fs)
但是,如果我希望大部分静态文件嵌入到二进制文件中,而有些静态文件不嵌入,可以与二进制文件一起使用,我尝试混合上述定义的两种方法,但没有成功,只有“嵌入”的文件可以正常运行,下面的代码失败了,有什么想法吗?
//go:embed static
var staticFiles embed.FS
// 使用http.FS创建http文件系统
var staticFS = http.FS(staticFiles)
fs := http.FileServer(staticFS) // 嵌入的静态文件
// 服务静态文件
http.Handle("/static/", fs)
www := http.FileServer(http.Dir("./files/")) // 附加的静态文件,与二进制文件放在一起
// 服务静态文件
http.Handle("/files/", www)
英文:
In go, we can handle static files, by defining their directory as static directory as shown below:
fs := http.FileServer(http.Dir("./static/"))
http.Handle("/files/", fs)
Where static files folder static
should be beside the binary.
Another way, is to use the new //go embed
as:
//go:embed static
var staticFiles embed.FS
// http.FS can be used to create a http Filesystem
var staticFS = http.FS(staticFiles)
fs := http.FileServer(staticFS) // embeded static files
// Serve static files
http.Handle("/static/", fs)
But what if I want to have most of my static files embedded in the binary, and some are not, that can be used alongside the binary, I tried to mix both method defined above, but did not work, only the embedded
ones run smoothly, below code failed, any thought?:
//go:embed static
var staticFiles embed.FS
// http.FS can be used to create a http Filesystem
var staticFS = http.FS(staticFiles)
fs := http.FileServer(staticFS) // embeded static files
// Serve static files
http.Handle("/static/", fs)
www := http.FileServer(http.Dir("./files/")) // side static files, to be beside binary
// Serve static files
http.Handle("/files/", www)
答案1
得分: 1
我找到了,缺少了http.StripPrefix
,下面的代码对我来说完美地工作了,并且有多个静态文件夹:
package main
import (
"embed"
"encoding/json"
"fmt"
"log"
"net/http"
)
//go:embed static
var staticFiles embed.FS
func main() {
go func() {
http.HandleFunc("/favicon.ico", func(rw http.ResponseWriter, r *http.Request) {})
// http.FS可以用来创建一个http文件系统
var staticFS = http.FS(staticFiles)
fs := http.FileServer(staticFS) // 嵌入的静态文件
// 提供静态文件,嵌入到二进制文件中
http.Handle("/static/", fs)
// 提供公共文件,位于二进制文件旁边
http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.Dir("./files"))))
http.HandleFunc("/getSkills", getSkills)
log.Println("Listening on :3000...")
err := http.ListenAndServe(":3000", nil)
if err != nil {
log.Fatal(err)
}
}
英文:
I found it, was missing http.StripPrefix
, below worked perfectly with me, and have multiple static folders:
package main
import (
"embed"
"encoding/json"
"fmt"
"log"
"net/http"
)
//go:embed static
var staticFiles embed.FS
func main() {
go func() {
http.HandleFunc("/favicon.ico", func(rw http.ResponseWriter, r *http.Request) {})
// http.FS can be used to create a http Filesystem
var staticFS = http.FS(staticFiles)
fs := http.FileServer(staticFS) // embeded static files
// Serve static files, to be embedded in the binary
http.Handle("/static/", fs)
// Serve public files, to be beside binary
http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.Dir("./files"))))
http.HandleFunc("/getSkills", getSkills)
log.Println("Listening on :3000...")
err := http.ListenAndServe(":3000", nil)
if err != nil {
log.Fatal(err)
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论