Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 从URL的根路径为嵌入式文件系统提供服务_Go - Fatal编程技术网

Go 从URL的根路径为嵌入式文件系统提供服务

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

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(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混淆了。对不起。