go语言实现一个简单的文件服务器 http.FileServer

package main

import (
    "flag"
    "fmt"
    "github.com/julienschmidt/httprouter"
    "log"
    "net/http"
    "strings"
    "time"
)

func main() {

    root := flag.String("p", "", "file server root directory")
    flag.Parse()

    if len(*root) == 0 {
        log.Fatalln("file server root directory not set")
    }

    if !strings.HasPrefix(*root, "/") {
        log.Fatalln("file server root directory not begin with '/'")
    }

    if !strings.HasSuffix(*root, "/") {
        log.Fatalln("file server root directory not end with '/'")
    }

    p, h := NewFileHandle(*root)
    r := httprouter.New()
    r.GET(p, LogHandle(h))

    log.Fatalln(http.ListenAndServe(":8080", r))
}

func NewFileHandle(path string) (string, httprouter.Handle) {
    return fmt.Sprintf("%s*files", path), func(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
        http.StripPrefix(path, http.FileServer(http.Dir(path))).ServeHTTP(w, r)
    }
}

func LogHandle(handle httprouter.Handle) httprouter.Handle {
    return func(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
        now := time.Now()
        handle(w, r, p)
        log.Printf("%s %s %s done in %v", r.RemoteAddr, r.Method, r.URL.Path, time.Since(now))
    }
}

准备测试文件

1020024-20181127111038776-710033526.png

编译运行

1020024-20181127111058106-1909350684.png

用浏览器访问

1020024-20181127111118908-281947794.png
1020024-20181127111130474-1646543134.png
1020024-20181127111140040-69804360.png
1020024-20181127111152458-1676317363.png
1020024-20181127111203718-1331265530.png
1020024-20181127111214700-1032802747.png

转载于:https://www.cnblogs.com/xiangyang-li/p/10024978.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值