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  }