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

 更新时间:2025年12月14日 11:55:11   作者:笨笨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 多目录文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入解析Go语言中for循环的写法

    深入解析Go语言中for循环的写法

    这篇文章主要介绍了Go语言中for循环的写法,是Golang入门学习中的基础知识,需要的朋友可以参考下
    2015-10-10
  • Go并发原子操作 waitGroup 对象池

    Go并发原子操作 waitGroup 对象池

    本文详细介绍了Go语言中原子操作和并发同步工具的使用,文章通过代码示例详细说明了这些并发工具的正确使用方式,并分析了它们的实现原理和性能特点,下面就来详细的介绍一下
    2026-04-04
  • 基于Golang实现Excel表格的导入导出功能

    基于Golang实现Excel表格的导入导出功能

    最近项目开发中有涉及到Excel的导入与导出功能,特别是导出表格时需要特定的格式,所以本文给大家介绍了基于Golang实现Excel表格的导入导出功能,文中通过代码示例和图文介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • golang变量uint、int大小溢出后的结果方式

    golang变量uint、int大小溢出后的结果方式

    在Go语言中,变量的大小溢出后,`uint`类型会回绕到最小值,而`int`类型会回绕到最大值的相反数,例如,`uint8`溢出后会变成0,`int64`溢出后会变成最小的负数
    2024-12-12
  • Go语言dolphinscheduler任务调度处理

    Go语言dolphinscheduler任务调度处理

    这篇文章主要为大家介绍了Go语言dolphinscheduler任务调度处理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go Singleflight导致死锁问题解决分析

    Go Singleflight导致死锁问题解决分析

    这篇文章主要为大家介绍了Go Singleflight导致死锁问题解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • golang 中的 nil的场景分析

    golang 中的 nil的场景分析

    这篇文章主要介绍了golang 中的 nil,本文通过多种场景分析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Golang汇编之控制流深入分析讲解

    Golang汇编之控制流深入分析讲解

    这篇文章主要介绍了Golang汇编之控制流,程序执行的流程主要有顺序、分支和循环几种执行流程,本节主要讨论如何将Go语言的控制流比较直观地转译为汇编程序,或者说如何以汇编思维来编写Go语言代码,感兴趣的同学可以参考下文
    2023-05-05
  • golang xorm日志写入文件中的操作

    golang xorm日志写入文件中的操作

    这篇文章主要介绍了golang xorm日志写入文件中的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go处理包含多种引号的字符串的几种方法

    Go处理包含多种引号的字符串的几种方法

    在Go中,有几种方式可以处理包含多种引号的字符串,以确保代码的可读性和正确性,本文将给大家详细介绍了这几种处理方式,并通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-04-04

最新评论