文件上传
Echo 通过请求上下文读取 multipart 表单数据。文本字段使用 c.FormValue,单个文件使用
c.FormFile,要访问同一字段名下的多个文件则使用 c.MultipartForm。
上传带字段的单个文件
Section titled “上传带字段的单个文件”package main
import ( "context" "fmt" "io" "net/http" "os"
"github.com/labstack/echo/v5" "github.com/labstack/echo/v5/middleware")
func upload(c *echo.Context) error { // Read form fields name := c.FormValue("name") email := c.FormValue("email")
//----------- // 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 dst, err := os.Create(file.Filename) if err != nil { return err } defer dst.Close()
// Copy if _, err = io.Copy(dst, src); err != nil { return err }
return c.HTML(http.StatusOK, fmt.Sprintf("<p>File %s uploaded successfully with fields name=%s and email=%s.</p>", file.Filename, name, email))}
func main() { e := echo.New()
e.Use(middleware.RequestLogger()) e.Use(middleware.Recover())
e.Static("/", "public") e.POST("/upload", upload)
sc := echo.StartConfig{Address: ":1323"} if err := sc.Start(context.Background(), e); err != nil { e.Logger.Error("failed to start server", "error", err) }}<!doctype html><html lang="en"><head> <meta charset="utf-8"> <title>Single file upload</title></head><body><h1>Upload single file with fields</h1>
<form action="/upload" method="post" enctype="multipart/form-data"> Name: <input type="text" name="name"><br> Email: <input type="email" name="email"><br> Files: <input type="file" name="file"><br><br> <input type="submit" value="Submit"></form></body></html>上传带字段的多个文件
Section titled “上传带字段的多个文件”package main
import ( "context" "fmt" "io" "net/http" "os"
"github.com/labstack/echo/v5" "github.com/labstack/echo/v5/middleware")
func upload(c *echo.Context) error { // Read form fields name := c.FormValue("name") email := c.FormValue("email")
//------------ // Read files //------------
// Multipart form form, err := c.MultipartForm() if err != nil { return err } files := form.File["files"]
for _, file := range files { // Source src, err := file.Open() if err != nil { return err } defer src.Close()
// Destination dst, err := os.Create(file.Filename) if err != nil { return err } defer dst.Close()
// Copy if _, err = io.Copy(dst, src); err != nil { return err }
}
return c.HTML(http.StatusOK, fmt.Sprintf("<p>Uploaded successfully %d files with fields name=%s and email=%s.</p>", len(files), name, email))}
func main() { e := echo.New()
e.Use(middleware.RequestLogger()) e.Use(middleware.Recover())
e.Static("/", "public") e.POST("/upload", upload)
sc := echo.StartConfig{Address: ":1323"} if err := sc.Start(context.Background(), e); err != nil { e.Logger.Error("failed to start server", "error", err) }}<!doctype html><html lang="en"><head> <meta charset="utf-8"> <title>Multiple file upload</title></head><body><h1>Upload multiple files with fields</h1>
<form action="/upload" method="post" enctype="multipart/form-data"> Name: <input type="text" name="name"><br> Email: <input type="email" name="email"><br> Files: <input type="file" name="files" multiple><br><br> <input type="submit" value="Submit"></form></body></html>