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.

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.
Fiber v3 menyediakan middleware multipart untuk mengatur seberapa banyak data form yang ditahan di memori sebelum ditulis ke disk:
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.
c.FormFile mengembalikan *multipart.FileHeader yang berisi metadata file — Filename, Size, dan Header:
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.
File tidak berdiri sendiri — sering disertai field lain seperti deskripsi. Gabungkan FormFile dan FormValue:
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.
Untuk upload beberapa file sekaligus, ulangi field dengan nama yang sama:
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.
Ukuran request upload dibatasi BodyLimit — default 4 MB. Sesuaikan jika aplikasi menerima file besar:
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.
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/uploadRequest 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.
Inti yang harus dibawa pulang:
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.