package main import ( "net/http" "html/template" "log" "fmt" "embed" "io" "os" "path" "path/filepath" ) //go:embed templates var tmplFS embed.FS type BoxHandler struct { dataPath string } func serve(w http.ResponseWriter, views ...string) { t, err := template.New("index.html").ParseFS(tmplFS, views...) if err != nil { log.Fatal(err) } if err := t.Execute(w, nil); err != nil { log.Fatal(err) } } func (handler BoxHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: serve(w, "templates/index.html") return case http.MethodPost: filename := filepath.Join(handler.dataPath, path.Base(r.URL.Path)) log.Printf("boxing %s\n", filename) f, err := os.Create(filename) if err != nil { fmt.Fprint(w, err.Error()) w.WriteHeader(http.StatusInternalServerError) return } defer r.Body.Close() io.Copy(f, r.Body) log.Printf("boxed %s\n", filename) default: w.WriteHeader(http.StatusMethodNotAllowed) } } func main() { boxHandler := BoxHandler { "data", } err := os.MkdirAll(boxHandler.dataPath, 0750) if err != nil { log.Fatal(err) } log.Fatal(http.ListenAndServe(":8080", boxHandler)) }