From 2e8e63e4a719a2b3adeeed2f1f54a8f3388ac2e4 Mon Sep 17 00:00:00 2001 From: horus_arch Date: Tue, 12 May 2015 20:57:04 +0200 Subject: Add upload form. --- main.go | 45 ------------------------- template.go | 58 +++++++++++++++++++++++++++++--- upload.go | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 163 insertions(+), 50 deletions(-) create mode 100644 upload.go diff --git a/main.go b/main.go index 452ed35..c17edd1 100644 --- a/main.go +++ b/main.go @@ -3,11 +3,9 @@ package main import ( "flag" "fmt" - "io" "log" "net/http" "os" - "strings" ) func accessLog(h http.Handler, quiet bool) http.Handler { @@ -21,49 +19,6 @@ func accessLog(h http.Handler, quiet bool) http.Handler { return http.HandlerFunc(fn) } -func uploadHandler(dir string, quiet bool) http.Handler { - fn := func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Server", "uhttpd") - 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 + "/" - } - - 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() - _, err = io.Copy(out, file) - if err != nil { - w.WriteHeader(500) - w.Write([]byte(err.Error())) - log.Println("ERROR", err.Error()) - return - } - - if !quiet { - log.Println(r.Method, r.URL.Path, header.Filename, r.RemoteAddr) - } - w.Write([]byte("Uploaded " + header.Filename)) - } - return http.HandlerFunc(fn) -} - func main() { ip_f := flag.String("ip", "0.0.0.0", "IP adress to listen on.") port_f := flag.String("port", "3000", "Port to listen on.") diff --git a/template.go b/template.go index 017690d..124854c 100644 --- a/template.go +++ b/template.go @@ -103,10 +103,6 @@ func execTemplate(w http.ResponseWriter, r *http.Request, data string) { } -func NewTemplateHandler(handler http.Handler, allowedHost string) *TemplateHandler { - return &TemplateHandler{handler: handler} -} - func getTemplate() string { return ` @@ -164,7 +160,59 @@ func get404() string {

Please check for typos in your url.

- Go back to root

+ Go back to root +

+ + + +` +} + +func getUpload() string { + return ` + + + + Upload Form + + + + +
+
+

Upload Form

+
+

You are going to upload a file. Here you can search to add it.

+ +
+ +
+
+
+ + +` +} + +func getUploaded() string { + return ` + + + + Uploaded {{.File}} + + + + +
+
+

Uploaded!

+

+ {{.File}} was successfull uploaded. +

+

+ Back to root +

diff --git a/upload.go b/upload.go new file mode 100644 index 0000000..6e0ce56 --- /dev/null +++ b/upload.go @@ -0,0 +1,110 @@ +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) { + + // uhttpd 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 }{File: header.Filename}) + 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, nil) + if err != nil { + log.Println(err.Error()) + w.WriteHeader(500) + w.Write([]byte(err.Error())) + return + } + return + } + } + return http.HandlerFunc(fn) +} -- cgit v1.2.3