Maison >développement back-end >Golang >Deux dossiers dans le système de fichiers sous forme de dossier virtuel dans le chemin de l'adresse du site (serveur web en Go)

Deux dossiers dans le système de fichiers sous forme de dossier virtuel dans le chemin de l'adresse du site (serveur web en Go)

WBOY
WBOYavant
2024-02-15 08:50:091315parcourir

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

L'éditeur PHP Youzi a mentionné deux dossiers dans le système de fichiers dans le cadre de l'adresse du site lors de l'introduction des dossiers virtuels dans le chemin du serveur Web. Dans le langage Go, cette notion de dossiers virtuels est largement utilisée dans le paramétrage des chemins des serveurs web. En incluant ces deux dossiers dans l'adresse du site, une gestion plus flexible du chemin d'accès aux fichiers et un contrôle d'accès peuvent être obtenus. Ce modèle de conception simplifie non seulement l'organisation des fichiers du site, mais offre également une meilleure sécurité et une meilleure maintenabilité. Grâce au concept de dossiers virtuels, les développeurs peuvent gérer et contrôler les ressources du site plus facilement.

Contenu de la question

Il y a deux dossiers "files1" et "files2" dans mon système de fichiers.

Je peux héberger un dossier dans le système de fichiers en tant que dossier virtuel dans le chemin d'adresse du site comme ceci :

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

Comment héberger le contenu des dossiers "files1" et "files2" sur le même chemin de l'adresse du site "/public/" ?

Solution de contournement

Une solution simple consiste à implémenter l'interface http.filesystem.

Voici la démo :

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
}

J'ai testé avec cette structure de répertoires :

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

Il y en a deux en f1-1.txt,由于先尝试files1,所以服务的是files1.

Mise à jour :

Comme demandé par l'auteur, une autre version de mergeddir prend en charge plusieurs répertoires :

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
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer