github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/03_form/demo05_uploadserver.go (about) 1 package main 2 3 import ( 4 "crypto/md5" 5 "fmt" 6 "html/template" 7 "io" 8 "log" 9 "net/http" 10 "os" 11 "strconv" 12 "time" 13 ) 14 15 // 处理/upload 逻辑 16 func upload(w http.ResponseWriter, r *http.Request) { 17 fmt.Println("method:", r.Method) //获取请求的方法 18 if r.Method == http.MethodGet { 19 curtime := time.Now().Unix() // unix 时间戳 20 h := md5.New() 21 curtimeStr := strconv.FormatInt(curtime, 10) 22 fmt.Println(curtimeStr) 23 io.WriteString(h, curtimeStr) 24 token := fmt.Sprintf("%x", h.Sum(nil)) 25 fmt.Println("token ->", token) 26 t, _ := template.ParseFiles("upload.html") 27 t.Execute(w, token) 28 } else { 29 r.ParseMultipartForm(32 << 20) 30 token := r.Form.Get("token") 31 if token != "" { 32 //验证token的合法性 33 fmt.Println("token:", token) 34 } else { 35 //不存在token报错 36 fmt.Println("token有误。。") 37 //return 38 } 39 file, fileHeader, err := r.FormFile("uploadfile") 40 if err != nil { 41 fmt.Println(err) 42 return 43 } 44 defer file.Close() 45 fmt.Fprintf(w, "%v", fileHeader.Header) 46 f, err := os.Create("./test/" + fileHeader.Filename) 47 //f, err := os.OpenFile("./test/"+fileHeader.Filename, os.O_WRONLY|os.O_CREATE, 0666) // 打开本地的文件 48 if err != nil { 49 fmt.Println(err) 50 return 51 } 52 defer f.Close() 53 io.Copy(f, file) //拷贝 54 } 55 } 56 57 func main() { 58 http.HandleFunc("/upload", upload) 59 err := http.ListenAndServe(":8000", nil) //设置监听的端口 60 if err != nil { 61 log.Fatal("ListenAndServe: ", err) 62 } 63 }