Rumah >pembangunan bahagian belakang >Golang >Dua folder dalam sistem fail sebagai folder maya dalam laluan alamat tapak (pelayan web dalam Go)

Dua folder dalam sistem fail sebagai folder maya dalam laluan alamat tapak (pelayan web dalam Go)

WBOY
WBOYke hadapan
2024-02-15 08:50:091315semak imbas

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

Editor PHP Youzi menyebut dua folder dalam sistem fail sebagai sebahagian daripada alamat tapak apabila memperkenalkan folder maya dalam laluan pelayan web. Dalam bahasa Go, konsep folder maya ini digunakan secara meluas dalam tetapan laluan pelayan web. Dengan memasukkan kedua-dua folder ini sebagai sebahagian daripada alamat tapak, pengurusan laluan fail dan kawalan akses yang lebih fleksibel boleh dicapai. Corak reka bentuk ini bukan sahaja memudahkan penyusunan fail tapak, tetapi juga menyediakan keselamatan dan kebolehselenggaraan yang lebih baik. Melalui konsep folder maya, pembangun boleh mengurus dan mengawal sumber tapak dengan lebih mudah.

Kandungan soalan

Terdapat dua folder "files1" dan "files2" dalam sistem fail saya.

Saya boleh mengehoskan folder dalam sistem fail sebagai folder maya dalam laluan alamat tapak seperti ini:

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

Bagaimana untuk mengehoskan kandungan folder "files1" dan "files2" pada laluan yang sama dengan alamat tapak "/public/"?

Penyelesaian

Penyelesaian mudah ialah melaksanakan antara muka http.filesystem.

Ini demonya:

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
}

Saya telah menguji dengan struktur direktori ini:

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

Ada dua dalam f1-1.txt,由于先尝试files1,所以服务的是files1.

Kemas kini:

Seperti yang diminta oleh pengarang, versi lain mergeddir menyokong berbilang direktori:

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
}

Atas ialah kandungan terperinci Dua folder dalam sistem fail sebagai folder maya dalam laluan alamat tapak (pelayan web dalam Go). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam