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

2024年 2月 15日 38.7k 0

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

php小编柚子在介绍Web服务器路径中的虚拟文件夹时提到了文件系统中的两个文件夹作为站点地址的一部分。在Go语言中,这种虚拟文件夹的概念被广泛应用于Web服务器的路径设置中。通过将这两个文件夹作为站点地址的一部分,可以实现更灵活的文件路径管理和访问控制。这种设计模式不仅简化了站点文件的组织,还提供了更好的安全性和可维护性。通过虚拟文件夹的概念,开发人员可以更加方便地对站点资源进行管理和控制。

问题内容

我的文件系统中有两个文件夹“files1”和“files2”。

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

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

登录后复制

如何将“files1”和“files2”文件夹的内容托管在站点地址“/public/”的同一路径上?

解决方法

一个简单的解决方案是实现 http.filesystem 接口。

这是演示:

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
}

登录后复制

以上就是文件系统中的两个文件夹作为站点地址(Go 中的 Web 服务器)路径中的一个虚拟文件夹的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论