文件系统中的两个文件夹作为站点地址(Go中的web服务器)路径中的一个虚拟文件夹



文件系统中有两个文件夹"files1"one_answers"files2".

我可以将文件系统中的一个文件夹作为一个虚拟文件夹托管在站点地址的路径中,如下所示:

http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.Dir("./files1"))))

如何存放文件的内容?和";files2"与网站地址"/public/"相同路径上的文件夹

?

一个简单的解决方案是实现http。文件系统接口。

下面是演示:

package main
import (
"errors"
"io/fs"
"net/http"
)
func main() {
http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(mergedDir{
Dir1: "./files1",
Dir2: "./files2",
})))
http.ListenAndServe(":8080", nil)
}
type mergedDir struct {
Dir1 http.Dir // Dir1 will be tried first so it has higher priority.
Dir2 http.Dir
}
func (d mergedDir) Open(name string) (http.File, error) {
f, err := d.Dir1.Open(name)
if err != nil {
if errors.Is(err, fs.ErrNotExist) {
return d.Dir2.Open(name)
}
}
return f, err
}

我已经测试了这个目录结构:

├── files1
│   ├── f1-1.txt
│   └── f1-sub
│       └── f1-s.txt
└── files2
├── f1-1.txt
├── f2-1.txt
└── f2-sub
└── f2-s.txt

有两个f1-1.txt,files1中的一个被服务,因为files1先被尝试。


更新:

另一个支持作者所要求的多个目录的mergedDir版本:

type mergedDir struct {
Dirs []http.Dir
}
func (d mergedDir) Open(name string) (http.File, error) {
for _, dir := range d.Dirs {
f, err := dir.Open(name)
if err == nil {
return f, nil
}
if !errors.Is(err, fs.ErrNotExist) {
return f, err
}
}
return nil, fs.ErrNotExist
}

相关内容

最新更新