diff --git a/24-httpserver/httpserver/static/city.txt b/24-httpserver/httpserver/static/city.txt
new file mode 100644
index 0000000..0a47067
--- /dev/null
+++ b/24-httpserver/httpserver/static/city.txt
@@ -0,0 +1,2 @@
+城市:重庆
+姓名:颜佐光
\ No newline at end of file
diff --git a/24-httpserver/httpserver/static/upload.html b/24-httpserver/httpserver/static/upload.html
new file mode 100644
index 0000000..917464d
--- /dev/null
+++ b/24-httpserver/httpserver/static/upload.html
@@ -0,0 +1,31 @@
+
+
+
+
+
+ Pro Go
+
+
+
+
+ Upload File
+
+
+
+
\ No newline at end of file
diff --git a/24-httpserver/httpserver/upload.go b/24-httpserver/httpserver/upload.go
new file mode 100644
index 0000000..b3ba78a
--- /dev/null
+++ b/24-httpserver/httpserver/upload.go
@@ -0,0 +1,51 @@
+package main
+
+import (
+ "fmt"
+ "io"
+ "net/http"
+)
+
+func HandleMultipartForm(writer http.ResponseWriter, request *http.Request) {
+ fmt.Fprintf(writer, "Name: %v , City : %v \n", request.FormValue("name"), request.FormValue("city"))
+ fmt.Fprintln(writer, "--------")
+
+ file, header, err := request.FormFile("files")
+ if err != nil {
+ http.Error(writer, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ defer file.Close()
+ fmt.Fprintf(writer, "File Name: %v, File Size: %v \n", header.Filename, header.Size)
+ for k, v := range header.Header {
+ fmt.Fprintf(writer, "Key: %v , Value: %v \n", k, v)
+ }
+ fmt.Fprintln(writer, "--------")
+ io.Copy(writer, file)
+}
+
+func HandleMultipartForm2(writer http.ResponseWriter, request *http.Request) {
+ request.ParseMultipartForm(10 * 1024 * 1024)
+ fmt.Fprintf(writer, "Name: %v , City : %v \n", request.FormValue("name"), request.FormValue("city"))
+ fmt.Fprintln(writer, "--------\n")
+
+ for _, header := range request.MultipartForm.File["files"] {
+ fmt.Fprintf(writer, "\n\n--------\nFile Name: %v, File Size: %v \n", header.Filename, header.Size)
+ file, err := header.Open()
+ if err != nil {
+ http.Error(writer, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ defer file.Close()
+ for k, v := range header.Header {
+ fmt.Fprintf(writer, "Key: %v , Value: %v \n", k, v)
+ }
+ fmt.Fprintln(writer, "--------")
+ io.Copy(writer, file)
+ }
+
+}
+
+func init() {
+ http.HandleFunc("/forms/upload", HandleMultipartForm2)
+}