从目录上看,代码的内容非常简单。picture.go包含了所有的交互代码,list.html和upload.html则包含了使用到的模板文件,而uploads目录则保存了所有上传的image文件。
picture.go代码内容:
package mainimport "io"import "log"import "os"import "net/http"import "html/template"import "io/ioutil"const (UPLOAD_DIR = "./uploads")func uploadHandler (w http.ResponseWriter, r * http.Request) {if r.Method == "GET" {t, _ := template.ParseFiles("upload.html")t.Execute(w, nil)}else {f, h, _ := r.FormFile("image")filename := h.Filenamedefer f.Close()t, _ := os.Create(UPLOAD_DIR + "/" + filename)defer t.Close()_, err := io.Copy(t, f)if err != nil {return}http.Redirect(w, r, "view?id=" + filename, http.StatusFound)}}func viewHandler(w http.ResponseWriter, r* http.Request) {imageId := r.FormValue("id")imagePath := UPLOAD_DIR + "/" + imageIdw.Header().Set("Content-Type", "image")http.ServeFile(w, r, imagePath)}func listHandler(w http.ResponseWriter, r* http.Request) {fileInfoArr, _ := ioutil.ReadDir(UPLOAD_DIR)locals := make(map[string] interface{})images := []string{}for _, fileInfo := range fileInfoArr {images = append(images, fileInfo.Name())}locals["images"] = imagest, _ := template.ParseFiles("list.html")t.Execute(w, locals)}func main() {http.HandleFunc("/upload", uploadHandler)http.HandleFunc("/view", viewHandler)http.HandleFunc("/", listHandler)err := http.ListenAndServe(":9090", nil)if err != nil {log.Fatal("ListenAndServe: ", err.Error())}}
其实这个网站主要就3个网页。一个是显示所有图片的索引,一个是图片显示,另外一个就是图片上传页面。
upload.html
<!doctype html><html><head><meta charset = "utf-8"><tilte> Uploader </title></head><body><form method="post" action="/upload" enctype="multipart/form-data">Choose an image to upload: <input name="image" type="file" /><input type="submit" value="Upload" /></form></body></html>
list.html
<!doctype html><html><head><meta charset="utf-8"><title> List </title></head><body><ol>{{range $.images}}<li><a href="/view?id={{.|urlquery}}"> {{.|html}} </a> </li>{{end}}</ol></body></html

