Go 从URL的根路径为嵌入式文件系统提供服务
Go 1.16添加了新包。我想使用这个包嵌入一个目录,并通过HTTP提供服务。考虑以下设置:Go 从URL的根路径为嵌入式文件系统提供服务,go,Go,Go 1.16添加了新包。我想使用这个包嵌入一个目录,并通过HTTP提供服务。考虑以下设置: myproject/ |-- main.go |-- static/ | |-- index.html | |-- styles.css | |-- scripts.js 主程序包 进口( “嵌入” “日志” “net/http” ) //go:嵌入静态 var staticFS embed.FS func main(){ http.Handle(“/”,http.FileServer(h
myproject/
|-- main.go
|-- static/
| |-- index.html
| |-- styles.css
| |-- scripts.js
主程序包
进口(
“嵌入”
“日志”
“net/http”
)
//go:嵌入静态
var staticFS embed.FS
func main(){
http.Handle(“/”,http.FileServer(http.FS(staticFS)))
log.Fatal(http.ListenAndServe(“:8080”,nil))
}
通过这种设置,我的期望是可以将浏览器指向localhost:8080
,并将其加载到index.html
。相反,我观察到的是,我需要将浏览器指向localhost:8080/static
以加载index.html
如何从URL的根路径为嵌入式文件系统提供服务?声明类型的变量时,该变量表示已包含根目录的文件系统。
//go:embed
指令中的所有资源都复制到文件系统的根目录中。这意味着staticFS
变量不是指直接嵌入的static
文件夹,而是指包含static
文件夹的根目录。考虑到这一点,为了实现能够从localhost:8080
访问static
文件夹的理想结果,可以使用Go将文件系统传递到服务器,其中static
文件夹是根目录:
主程序包
进口(
“嵌入”
“io/fs”
“日志”
“net/http”
)
//go:嵌入静态
var embeddedFS embed.FS
func main(){
serverRoot,err:=fs.Sub(embeddedFS,“静态”)
如果错误!=零{
log.Fatal(错误)
}
http.Handle(“/”,http.FileServer(http.FS(serverRoot)))
log.Fatal(http.ListenAndServe(“:8080”,nil))
}
或者,您可以在静态目录中声明嵌入
package static
//go:embed *.html *.css *.js
var FS embed.FS
然后导入它
package main
import (
"embed"
"log"
"net/http"
"import/path/to/static"
)
func main() {
http.Handle("/", http.FileServer(http.FS(static.FS)))
log.Fatal(http.ListenAndServe(":8080", nil))
}
将嵌入添加到静态目录的缺点是,除非使用严格的文件掩码,否则也可以将*.go
文件添加为嵌入文件(例如//go:embed*.html*js
而不是//go:embed*
)
编辑:删除了另外建议的
http.StripPrefix
,因为它实际上无助于解决这个问题。两个备选方案中的第一个效果很好。但是,当我尝试第二种选择(使用http.StripPrefix)时,我只在localhost:8080/static/static
上得到index.html
。哦,你说得对!相反,我把它和不存在的http.AddPrefix混淆了。对不起。