如何在Go Web服务器中将两个本地文件夹映射为同一虚拟路径
实现多个文件夹共享同一虚拟路径的方案
要将files1和files2同时托管到/public/路径下,你需要自定义一个能合并多个文件系统的http.FileSystem,让请求先从第一个文件夹查找资源,找不到时再去第二个文件夹查找。
具体实现代码
package main import ( "net/http" "os" ) // 定义合并多个文件系统的结构体 type mergedFS struct { primary http.FileSystem secondary http.FileSystem } // 实现http.FileSystem的Open方法 func (m mergedFS) Open(name string) (http.File, error) { // 先尝试从primary文件夹打开文件 f, err := m.primary.Open(name) if err == nil { return f, nil } // 如果文件不存在,尝试从secondary文件夹打开 if os.IsNotExist(err) { return m.secondary.Open(name) } // 返回其他类型的错误(比如权限问题) return nil, err } func main() { // 初始化两个本地文件夹的文件系统 fs1 := http.Dir("./files1") fs2 := http.Dir("./files2") // 创建合并后的文件系统 merged := mergedFS{primary: fs1, secondary: fs2} // 注册路由,将/public/路径映射到合并后的文件系统 http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(merged))) // 启动服务 http.ListenAndServe(":8080", nil) }
关键细节说明
- 当请求
/public/xxx时,会先在files1中查找xxx文件,找到就返回;找不到再去files2中查找。 - 如果两个文件夹存在同名文件,
files1中的文件会被优先返回。 - 访问目录(比如
/public/)时,会按照同样的优先级查找index.html等默认索引文件。
内容的提问来源于stack exchange,提问作者WayMax
相关产品推荐
相关产品推荐

