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
Libérer: 2024-02-15 08:50:09
avant
1298 Les gens l'ont consulté

文件系统中的两个文件夹作为站点地址(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"))))
Copier après la connexion

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
}
Copier après la connexion

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
Copier après la connexion

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
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal