服务器代码
package main
import (
"fmt"
"html/template"
"io"
"log"
"net/http"
"os"
)
//上传方法
func upload(w http.ResponseWriter, r *http.Request) {
//这里是get请求
if r.Method == "GET" {
t, _ := template.ParseFiles("upload.html")
t.Execute(w, nil)
} else if r.Method == "POST" {
// 服务端调用r.ParseMultipartForm,把上传的文件存储在内存和临时文件中 32 << 20 是一个很大的值:33554432
r.ParseMultipartForm(32 << 20)
//这里获取表单的uploadfile
file, handler, err := r.FormFile("uploadfile")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
//这里打开文件buffer
f, err := os.OpenFile("./upload/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
//把文件cp到指定目录下。
io.Copy(f, file)
fmt.Fprintf(w, "%v", handler.Header)
fmt.Fprintf(w, "上传成功")
} else {
fmt.Println("error")
}
}
func main() {
http.HandleFunc("/upload", upload)
err := http.ListenAndServe(":8081", nil)
if err != nil {
log.Fatal("ListenAndServe:", err)
}
}
上传页面代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>go 上传test</title>
</head>
<body>
<form method="POST" action="/upload" enctype="multipart/form-data" >
<input type="file" name="uploadfile" />
<input type="submit" value="上传">
</form>
</body>
</html>