package main import ( "html/template" "io" "net/http" "os" "path/filepath" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" ) type Template struct { templates *template.Template } func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error { return t.templates.ExecuteTemplate(w, name, data) } func upload(c echo.Context) error { //----------- // Read file //----------- // Source file, err := c.FormFile("file") if err != nil { return err } src, err := file.Open() if err != nil { return err } defer src.Close() // Destination destinationPath := filepath.Join("files", file.Filename) destinationUrl := filepath.Join("/files", file.Filename) dst, err := os.Create(destinationPath) if err != nil { return err } defer dst.Close() // Copy if _, err = io.Copy(dst, src); err != nil { return err } return c.Render(http.StatusOK, "uploaded", map[string]string{"URI": destinationUrl}) } func main() { t := &Template{ templates: template.Must(template.ParseGlob("views/templates/*.html")), } e := echo.New() e.Renderer = t e.Use(middleware.Logger()) e.Use(middleware.Recover()) e.Static("/files", "files") e.Static("/assets", "assets") e.File("/admin", "views/index.html") e.POST("/admin/upload", upload) e.Logger.Fatal(e.Start(":1323")) }