一直讲golang标准库,不仅大家看烦了,我自己写的都比较难受了,所以写一个简单的静态文件服务器,里边有上传下载,和简单的html,你可以根据你自己的需求来修改~~
包含功能
- 静态文件模板
- 文件上传
- 文件查看和下载
使用的包
import (
"fmt"
"html/template"
"io"
"net/http"
"os"
"path/filepath"
"regexp"
"strconv"
"time"
)
包含知识点
//静态文件服务器
http.FileServer(http.Dir("目录"))
//手工配置服务和路由
s := &http.Server{
Addr: ":8080",
Handler: myHandler,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
s.ListenAndServe();
// path/filepath包的使用
麻雀虽小,但是有很多基础知识点适合学习golang的朋友们一起玩,代码示例地址:http://github.com/widuu/staticserver
实例代码staticserver.go
package main
import (
"fmt"
"html/template"
"io"
"net/http"
"os"
"path/filepath"
"regexp"
"strconv"
"time"
)
var mux map[string]func(http.ResponseWriter, *http.Request)
type Myhandler struct{}
type home struct {
Title string
}
const (
Template_Dir = "./view/"
Upload_Dir = "./upload/"
)
func main() {
server := http.Server{
Addr: ":9090",
Handler: &Myhandler{},
ReadTimeout: 10 * time.Second,
}
mux = make(map[string]func(http.ResponseWriter, *http.Request))
mux["/"] = index
mux["/upload"] = upload
mux["/file"] = StaticServer
server.ListenAndServe()
}
func (*Myhandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if h, ok := mux[r.URL.String()]; ok {
h(w, r)
return
}
if ok, _ := regexp.MatchString("/css/", r.URL.String()); ok {
http.StripPrefix("/css/", http.FileServer(http.Dir("./css/"))).ServeHTTP(w, r)
} else {
http.StripPrefix("/", http.FileServer(http.Dir("./upload/"))).ServeHTTP(w, r)
}
}
func upload(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
t, _ := template.ParseFiles(Template_Dir + "file.html")
t.Execute(w, "上传文件")
} else {
r.ParseMultipartForm(32 << 20)
file, handler, err := r.FormFile("uploadfile")
if err != nil {
fmt.Fprintf(w, "%v", "上传错误")
return
}
fileext := filepath.Ext(handler.Filename)
if check(fileext) == false {
fmt.Fprintf(w, "%v", "不允许的上传类型")
return
}
filename := strconv.FormatInt(time.Now().Unix(), 10) + fileext
f, _ := os.OpenFile(Upload_Dir+filename, os.O_CREATE|os.O_WRONLY, 0660)
_, err = io.Copy(f, file)
if err != nil {
fmt.Fprintf(w, "%v", "上传失败")
return
}
filedir, _ := filepath.Abs(Upload_Dir + filename)
fmt.Fprintf(w, "%v", filename+"上传完成,服务器地址:"+filedir)
}
}
func index(w http.ResponseWriter, r *http.Request) {
title := home{Title: "首页"}
t, _ := template.ParseFiles(Template_Dir + "index.html")
t.Execute(w, title)
}
func StaticServer(w http.ResponseWriter, r *http.Request) {
http.StripPrefix("/file", http.FileServer(http.Dir("./upload/"))).ServeHTTP(w, r)
}
func check(name string) bool {
ext := []string{".exe", ".js", ".png"}
for _, v := range ext {
if v == name {
return false
}
}
return true
}
未经允许,不得转载本站任何文章:微度网络 » 一百行golng代码写一个静态文件服务器
有疑问加站长微信联系(非本文作者)