Belajar Fiber - File Upload (Multipart Form)
Episode 17 of 23

Belajar Fiber - File Upload (Multipart Form)

Episode ini membahas upload file di Fiber v3: middleware multipart dengan konfigurasi Memory, membaca file lewat c.FormFile dan c.SaveFile, upload banyak file dan field tambahan, batasan ukuran body, serta penyajian kembali file yang diupload.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Hampir semua aplikasi web butuh menerima file: avatar, lampiran, dokumen. Episode 17 membahas file upload di Fiber v3 — cara memproses multipart form, membaca dan menyimpan file, mengatur batasan ukuran, serta menyajikan kembali file yang sudah diupload.

Upload file tampak sederhana, tapi punya banyak jebakan: ukuran file, memori, keamanan nama file, dan batas body. Memahami mekanisme multipart Fiber menyelesaikan masalah-masalah itu sejak awal.

Middleware Multipart

Setup multipart dengan Memory

Fiber v3 menyediakan middleware multipart untuk mengatur seberapa banyak data form yang ditahan di memori sebelum ditulis ke disk:

Middleware multipart
import "github.com/gofiber/fiber/v3/middleware/multipart"
 
app.Post("/upload", multipart.New(multipart.Config{
    Memory: 10 << 20, // 10 MB
}), func(c fiber.Ctx) error {
    file, err := c.FormFile("file")
    if err != nil {
        return err
    }
    return c.SaveFile(file, fmt.Sprintf("./uploads/%s", file.Filename))
})

Memory: 10 << 20 berarti file hingga 10 MB ditahan di memori; di atas itu ditulis ke file sementara di disk. c.FormFile("file") mengambil file sesuai nama field form, dan c.SaveFile menyimpannya ke folder uploads.

Membaca dan Menyimpan File

SaveFile dan FileHeader

c.FormFile mengembalikan *multipart.FileHeader yang berisi metadata file — Filename, Size, dan Header:

Menyimpan dengan metadata
app.Post("/upload", multipart.New(multipart.Config{
    Memory: 10 << 20,
}), func(c fiber.Ctx) error {
    file, err := c.FormFile("file")
    if err != nil {
        return err
    }
    log.Printf("file: %s (%d bytes)", file.Filename, file.Size)
 
    if file.Size > 5<<20 {
        return fiber.NewError(fiber.StatusRequestEntityTooLarge,
            "file terlalu besar")
    }
    return c.SaveFile(file, fmt.Sprintf("./uploads/%s", file.Filename))
})

Setelah FormFile, metadata tersedia di FileHeader. Validasi manual seperti cek Size bisa dilakukan sebelum menyimpan. SaveFile membuka, menyalin, dan menutup file ke lokasi tujuan dalam satu langkah.

Form dengan Field Tambahan

File tidak berdiri sendiri — sering disertai field lain seperti deskripsi. Gabungkan FormFile dan FormValue:

File plus field teks
app.Post("/upload", multipart.New(multipart.Config{
    Memory: 10 << 20,
}), func(c fiber.Ctx) error {
    desc := c.FormValue("description")
    file, err := c.FormFile("file")
    if err != nil {
        return err
    }
    if err := c.SaveFile(file, fmt.Sprintf("./uploads/%s", file.Filename)); err != nil {
        return err
    }
    return c.JSON(fiber.Map{"description": desc, "saved": file.Filename})
})

c.FormValue("description") membaca field teks dari form yang sama. Kombinasi ini menangani kasus nyata: file beserta metadata-nya dikirim dalam satu request.

Banyak File Sekaligus

Mengiterasi FormFile

Untuk upload beberapa file sekaligus, ulangi field dengan nama yang sama:

Upload banyak file
app.Post("/upload", multipart.New(multipart.Config{
    Memory: 10 << 20,
}), func(c fiber.Ctx) error {
    form, err := c.MultipartForm()
    if err != nil {
        return err
    }
    files := form.File["photos"]
    for _, f := range files {
        if err := c.SaveFile(f, fmt.Sprintf("./uploads/%s", f.Filename)); err != nil {
            return err
        }
    }
    return c.JSON(fiber.Map{"count": len(files)})
})

c.MultipartForm() mengembalikan struktur form lengkap; form.File["photos"] berisi semua file dengan nama field photos. Loop menyimpan masing-masing. Untuk upload file dalam jumlah besar, pertimbangkan antrian — menyimpan ratusan file dalam satu request bisa membuat timeout.

Batasan Ukuran dan Body

BodyLimit di Konfigurasi App

Ukuran request upload dibatasi BodyLimit — default 4 MB. Sesuaikan jika aplikasi menerima file besar:

Naikkan batas body
app := fiber.New(fiber.Config{
    BodyLimit: 20 * 1024 * 1024, // 20 MB
})

BodyLimit: 20 * 1024 * 1024 menaikkan batas ukuran seluruh body request menjadi 20 MB. Jika request melebihi batas, Fiber mengembalikan status 413. Atur Memory middleware multipart lebih kecil dari BodyLimit agar file berukuran sedang ditulis ke disk, bukan membebani RAM.

Uji Coba

Upload lewat curl
curl -X POST -F "description=avatar lama" -F "file=@./avatar.png" \
  http://localhost:3000/upload
curl -X POST -F "photos=@a.png" -F "photos=@b.png" http://localhost:3000/upload

Request pertama mengirim satu file plus field description; request kedua mengirim dua file dengan field photos. Cek folder ./uploads — file tersimpan sesuai nama aslinya, dan log menampilkan ukuran masing-masing.

Penutup

Inti yang harus dibawa pulang:

  • Middleware multipart dengan config Memory mengontrol penahanan file di memori vs disk.
  • c.FormFile("file") mengambil file; c.SaveFile menyimpannya ke tujuan.
  • FileHeader menyediakan Filename, Size, dan Header untuk validasi.
  • c.FormValue membaca field teks di form yang sama.
  • c.MultipartForm().File[name] menangani upload banyak file.
  • fiber.Config{BodyLimit} membatasi ukuran request (default 4 MB).

Di episode 18 selanjutnya kita membahas CSRF, CORS, dan keamanan — middleware csrf dan cors di Fiber, konfigurasi origin, serta praktik melindungi API dari serangan lintas situs.