package main import ( "html/template" "io" "log" "net/http" "os" "strings" ) func uploadHandler(dir string, quiet bool) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { // µhttpd strong w.Header().Set("Server", "uhttpd") // we are handling the upload if r.Method == "POST" { // we need the input file named "file" file, header, err := r.FormFile("file") if err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) log.Println("ERROR", err.Error()) return } defer file.Close() if !strings.HasSuffix(dir, "/") { dir = dir + "/" } // lets create the desired file out, err := os.Create(dir + header.Filename) if err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) log.Println("ERROR", err.Error()) return } defer out.Close() // copy the old file in the created one _, err = io.Copy(out, file) if err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) log.Println("ERROR", err.Error()) return } // do not log upload if !quiet { log.Println(r.Method, r.URL.Path, header.Filename, r.RemoteAddr) } // print for cli client if r.URL.Query().Get("html") != "1" { w.Write([]byte("Uploaded: " + header.Filename)) return } // print for browser w.Header().Set("Content-Type", "text/html") tmpl := template.New("uploaded") tmpl, err = tmpl.Parse(getUploaded()) if err != nil { log.Println(err.Error()) w.WriteHeader(500) w.Write([]byte(err.Error())) return } err = tmpl.Execute(w, struct { File string Favicon template.HTML }{File: header.Filename, Favicon: getFavicon()}) if err != nil { log.Println(err.Error()) w.WriteHeader(500) w.Write([]byte(err.Error())) return } return } else { // we are just printing the upload form w.Header().Set("Content-Type", "text/html") tmpl := template.New("upload") tmpl, err := tmpl.Parse(getUpload()) if err != nil { log.Println(err.Error()) w.WriteHeader(500) w.Write([]byte(err.Error())) return } err = tmpl.Execute(w, struct{ Favicon template.HTML }{Favicon: getFavicon()}) if err != nil { log.Println(err.Error()) w.WriteHeader(500) w.Write([]byte(err.Error())) return } return } } return http.HandlerFunc(fn) }