From 5def3f17f1809eb3727efd21d4b482452620342b Mon Sep 17 00:00:00 2001 From: Horus3 Date: Fri, 8 May 2015 14:14:32 +0200 Subject: Add upload handler. --- main.go | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index cf428ed..36781f2 100644 --- a/main.go +++ b/main.go @@ -3,9 +3,11 @@ package main import ( "flag" "fmt" + "io" "log" "net/http" "os" + "strings" ) func accessLog(h http.Handler) http.Handler { @@ -15,10 +17,52 @@ func accessLog(h http.Handler) http.Handler { }) } +func uploadHandler(dir string) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + 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 + } + + 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.") dir_f := flag.String("dir", ".", "Directory to serve.") + disallow_upl_f := flag.Bool("disallow-upload", false, "Disallow uploads to /upload.") + upl_dir_f := flag.String("upload-dir", ".", "Directory to store uploaded files.") flag.Parse() @@ -28,5 +72,12 @@ func main() { } fmt.Println("Starting uhttpd serving \"" + *dir_f + "\" on " + *ip_f + ":" + port + ".") - log.Fatal(http.ListenAndServe(*ip_f+":"+port, accessLog(http.FileServer(http.Dir(*dir_f))))) + + mux := http.NewServeMux() + if !*disallow_upl_f { + os.MkdirAll(*upl_dir_f, 0755) + mux.Handle("/upload", uploadHandler(*upl_dir_f)) + } + mux.Handle("/", accessLog(http.FileServer(http.Dir(*dir_f)))) + log.Fatal(http.ListenAndServe(*ip_f+":"+port, mux)) } -- cgit v1.2.3