gpt4 book ai didi

http - 动态路由的文件服务器目录

转载 作者:行者123 更新时间:2023-12-03 10:10:48 25 4
gpt4 key购买 nike

我的场景
编译的角度项目保存为

.
├── branch1
│   ├── commitC
│   │   ├── app1
│   │   │   ├── index.html
│   │   │   └── stylesheet.css
│   └── commitD
│   ├── app1
│   │   ├── index.html
│   │   └── stylesheet.css
│   └── app2
│   ├── index.html
│   └── stylesheet.css
├── branch2
│   ├── commitE
│      ├── app1
│      │   ├── index.html
│      │   └── stylesheet.css
│      └── app2
│      ├── index.html
│      └── stylesheet.css
└── master
├── commitA
│   ├── app1
│   │   ├── index.html
│   │   └── stylesheet.css
└── commitB
├── app1
   ├── index.html
   └── stylesheet.css

数据库
TABLE data(id , branch, commit)
参赛作品:例如


ID
分支
犯罪


abc
分支1
提交

定义
分支1
提交


掌握
提交


现在我要访问
:8080/apps/{id}
例如:localhost:8080/apps/ abc
请求数据库条目后应生成路径
文件服务器提供目录
./files/ branch1 / commitC /
现在我希望看到文件夹app1和app2
我有什么
func main() {
mux = mux.NewRouter()
mux.HandleFunc("/apps/{id}/{app}", s.serveApp).Methods("GET")
}

func (s *Server) serveApp(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)

app := params["app"]
id := params["id"]

entry, err := getFromDB(id)
if err != nil {
w.Header().Set("Content-Type", "text/html")
respondWithError(w, http.StatusInternalServerError, err.Error())
return
}

file := filepath.Join(DefaultFolder, entry.Branch, entry.Commit, app, "index.html")

fmt.Printf("redirecting to %s", file)
http.ServeFile(w, r, file)
}
我该如何为整个目录提供服务,以便可以正确访问所有CSS和JS文件?
我想我需要这样的东西
http.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))
但是如何访问mux.Vars(request)建立目录路径?
############
关于CSS服务问题
import (
"log"
"net/http"

"github.com/gorilla/mux"
)

func main() {

mux := mux.NewRouter()

fs := http.FileServer(http.Dir("static"))
mux.Handle("/", fs)

log.Println("Listening...")
http.ListenAndServe(":3000", mux)
}
CSS文件用作“文本/纯文本”
文件:
  • main.go
  • 静态/
  • index.html
  • main.css


  • index.html
    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>A static page</title>
    <link rel="stylesheet" href="main.css">
    </head>
    <body>
    <h1>Hello from a static page</h1>
    </body>
    </html>
    main.css
    body {color: #c0392b}

    最佳答案

    http.FileServer返回一个处理程序。可以手动调用此处理程序,而不是将其注册到修订路径。
    您将原始的w http.ResponseWriter, r *http.Request参数传递给它,因此http.FileServer能够访问请求并写入响应。
    您可能需要将http.FileServer包装到http.StripPrefix处理程序中,以便将原始请求中的路径简化为相对于path变量的路径。

    func main() {
    mux = mux.NewRouter()
    mux.HandleFunc("/apps/{id}/{app}", s.serveApp).Methods("GET")
    }

    func (s *Server) serveApp(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)

    app := params["app"]
    id := params["id"]

    entry, err := getFromDB(id)
    if err != nil {
    w.Header().Set("Content-Type", "text/html")
    respondWithError(w, http.StatusInternalServerError, err.Error())
    return
    }

    path := filepath.Join(DefaultFolder, entry.Branch, entry.Commit, app)
    // the part already handled by serveApp handler must be stripped.
    baseURL := fmt.Sprintf("/apps/%s/%s/", id, app)

    pathHandler := http.FileServer(http.Dir(path))
    http.StripPrefix(baseURL, pathHandler).ServeHTTP(w, r)

    // or in one line
    // http.FileServer(http.StripPrefix(baseURL, http.Dir(path)).ServeHTTP(w, r)
    }

    关于http - 动态路由的文件服务器目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65216829/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com