Skip to content

Form Data

Learn how to handle form data in Iris.

Basic Form Handling

go
package main

import "github.com/kataras/iris/v12"

func main() {
    app := iris.New()

    app.Post("/submit", func(ctx iris.Context) {
        username := ctx.FormValue("username")
        email := ctx.FormValue("email")

        ctx.JSON(iris.Map{
            "username": username,
            "email": email,
        })
    })

    app.Listen(":8080")
}

File Upload

go
app.Post("/upload", iris.LimitRequestBodySize(32<<20), func(ctx iris.Context) {
    // Get uploaded file
    file, info, err := ctx.FormFile("file")
    if err != nil {
        ctx.StopWithError(iris.StatusBadRequest, err)
        return
    }
    defer file.Close()

    // Save to disk
    dest := filepath.Join("./uploads", info.Filename)
    ctx.SaveFormFile(info, dest)

    ctx.JSON(iris.Map{
        "filename": info.Filename,
        "size": info.Size,
    })
})

Multiple Files

go
app.Post("/upload-multiple", iris.LimitRequestBodySize(64<<20), func(ctx iris.Context) {
    // Get uploaded files
    form, err := ctx.MultipartForm()
    if err != nil {
        ctx.StopWithError(iris.StatusBadRequest, err)
        return
    }

    files := form.File["files[]"]
    filesInfo := make([]iris.Map, 0)

    for _, file := range files {
        // Save each file
        dest := filepath.Join("./uploads", file.Filename)
        ctx.SaveFormFile(file, dest)

        filesInfo = append(filesInfo, iris.Map{
            "filename": file.Filename,
            "size": file.Size,
        })
    }

    ctx.JSON(iris.Map{
        "uploaded": len(files),
        "files": filesInfo,
    })
})

Form Validation

go
type LoginForm struct {
    Username string `form:"username" validate:"required,min=3,max=32"`
    Password string `form:"password" validate:"required,min=6"`
    Email    string `form:"email" validate:"required,email"`
}

app.Post("/login", func(ctx iris.Context) {
    var form LoginForm
    if err := ctx.ReadForm(&form); err != nil {
        ctx.StopWithError(iris.StatusBadRequest, err)
        return
    }

    // Validate form
    if err := validate.Struct(form); err != nil {
        ctx.StopWithProblem(iris.StatusBadRequest, iris.NewProblem().
            Title("Validation Error").
            DetailErr(err))
        return
    }

    ctx.JSON(iris.Map{
        "message": "Form validated successfully",
        "form": form,
    })
})

Best Practices

  1. Validation:

    • Validate required fields
    • Check field types
    • Implement size limits
    • Handle file types
    • Sanitize input
  2. Security:

    • Set upload limits
    • Validate file types
    • Check file sizes
    • Scan for malware
    • Store securely
  3. Performance:

    • Handle large files
    • Use appropriate buffers
    • Monitor memory usage
    • Clean up resources
    • Implement timeouts
  4. Error Handling:

    • Provide clear messages
    • Handle validation errors
    • Log issues
    • Clean up on errors
    • Document requirements

Built with excellence by Hellenic Development, delivering enterprise-grade solutions.