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))
	}
}

准备测试文件

编译运行

用浏览器访问






posted @ 2018-11-27 10:38  kangeloo  阅读(2451)  评论(0编辑  收藏  举报