Heim  >  Artikel  >  Backend-Entwicklung  >  Zwei Ordner im Dateisystem als virtueller Ordner im Pfad der Site-Adresse (Webserver in Go)

Zwei Ordner im Dateisystem als virtueller Ordner im Pfad der Site-Adresse (Webserver in Go)

WBOY
WBOYnach vorne
2024-02-15 08:50:091221Durchsuche

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

PHP-Editor Youzi erwähnte zwei Ordner im Dateisystem als Teil der Site-Adresse, als er virtuelle Ordner im Webserverpfad einführte. In der Go-Sprache wird dieses Konzept virtueller Ordner häufig in den Pfadeinstellungen von Webservern verwendet. Durch die Aufnahme dieser beiden Ordner als Teil der Site-Adresse können eine flexiblere Dateipfadverwaltung und Zugriffskontrolle erreicht werden. Dieses Entwurfsmuster vereinfacht nicht nur die Organisation von Site-Dateien, sondern sorgt auch für bessere Sicherheit und Wartbarkeit. Durch das Konzept virtueller Ordner können Entwickler Site-Ressourcen bequemer verwalten und steuern.

Frageninhalt

In meinem Dateisystem gibt es zwei Ordner „files1“ und „files2“.

Ich kann einen Ordner im Dateisystem wie folgt als virtuellen Ordner im Site-Adresspfad hosten:

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

Wie hoste ich den Inhalt der Ordner „files1“ und „files2“ im selben Pfad der Site-Adresse „/public/“?

Workaround

Eine einfache Lösung besteht darin, die Schnittstelle http.filesystem zu implementieren.

Hier ist die Demo:

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
}

Ich habe es mit dieser Verzeichnisstruktur getestet:

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

Es gibt zwei in f1-1.txt,由于先尝试files1,所以服务的是files1.

Update:

Wie vom Autor gewünscht, unterstützt eine andere Version von mergeddir mehrere Verzeichnisse:

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
}

Das obige ist der detaillierte Inhalt vonZwei Ordner im Dateisystem als virtueller Ordner im Pfad der Site-Adresse (Webserver in Go). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen