golang WebDav 多目录文件服务

golang WebDav服务

golang官方提供了webdav服务包,但是,功能比较有限,这里主要针对一个端口,多目录做解释

普通WebDav服务

package main

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

func main() {
    http.ListenAndServe(":8080", &webdav.Handler{
        FileSystem: webdav.Dir("."),
        LockSystem: webdav.NewMemLS(),
    })
}

一个端口共享多用户/多目录

package main

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

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

	fs2 := &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()
}

你可能感兴趣的:(跨平台,Go语言)