登录
首页 >  Golang >  Go问答

将文件系统中的两个文件夹作为Web服务器路径中的一个虚拟文件夹

来源:stackoverflow

时间:2024-02-06 15:54:23 476浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《将文件系统中的两个文件夹作为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
}

好了,本文到此结束,带大家了解了《将文件系统中的两个文件夹作为Web服务器路径中的一个虚拟文件夹》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>