golang WebDav 多目录文件服务的实现
作者:笨笨D幸福
本文介绍使用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()
}
到此这篇关于golang WebDav 多目录文件服务的实现的文章就介绍到这了,更多相关golang WebDav 多目录文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
