失控半睡者 發表於 2025-12-14 11:55:11

golang WebDav 多目录文件服务的实现

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">普通WebDav服务</a></li><li><a href="#_label1">一个端口共享多用户/多目录</a></li></ul></div><p>golang官方提供了webdav服务包,但是,功能比较有限,这里主要针对一个端口,多目录做解释</p>
<p class="maodian"><a name="_label0"></a></p><h2>普通WebDav服务</h2>
<div class="jb51code"><pre class="brush:go;">package main

import (
    "net/http"
    "golang.org/x/net/webdav"
)

func main() {
    http.ListenAndServe(":8080", &amp;webdav.Handler{
      FileSystem: webdav.Dir("."),
      LockSystem: webdav.NewMemLS(),
    })
}
</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>一个端口共享多用户/多目录</h2>
<div class="jb51code"><pre class="brush:go;">package main

import (
        "fmt"
        "golang.org/x/net/webdav"
        "log"
        "net/http"
        "strings"
)

func Dav_Load() {
        s_mux := http.NewServeMux();
        fs := &amp;webdav.Handler{
                Prefix:   "/dav/",
                FileSystem: webdav.Dir("F:/"),
                LockSystem: webdav.NewMemLS(),
        }

        fs2 := &amp;webdav.Handler{
                Prefix:   "/dav2/",
                FileSystem: webdav.Dir("E:/"),
                LockSystem: webdav.NewMemLS(),
        }
        s_mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
                //log.Println(req.RequestURI)
                // 获取用户名/密码
                username, password, ok := req.BasicAuth()
                if !ok {
                        w.Header().Set("WWW-Authenticate", `Basic realm="Restricted"`)
                        w.WriteHeader(http.StatusUnauthorized)
                        return
                }
                // 验证用户名/密码
                if username != "a" || password != "b" {
                        http.Error(w, "WebDAV: need authorized!", http.StatusUnauthorized)
                        return
                }

                //switch req.Method {
                //case "PUT", "DELETE", "PROPPATCH", "MKCOL", "COPY", "MOVE":
                //        http.Error(w, "WebDAV: Read Only!!!", http.StatusForbidden)
                //        return
                //}
                if strings.HasPrefix(req.RequestURI, fs.Prefix) {
                        fs.ServeHTTP(w, req)
                        //fmt.Println("fs call")
                        return
                }
                if strings.HasPrefix(req.RequestURI, fs2.Prefix) {
                        fs2.ServeHTTP(w, req)
                        //fmt.Println("fs2 call")
                        return
                }

                // else
                w.WriteHeader(404)
        })

        dav_addr := fmt.Sprintf(":%v", 8082)
        log.Println("Dav Server run ", dav_addr)
        err := http.ListenAndServe(dav_addr, s_mux)
        if (err != nil) {
                fmt.Println("dav server run error:", err)
        }
}

func main() {
        Dav_Load()
}
</pre></div>
頁: [1]
查看完整版本: golang WebDav 多目录文件服务的实现