Membuat local upload file di Gofiber
Langkah-langkah Implementasi Upload File di Local
Buat Helper untuk Upload File:
Buat fungsi UploadFile
yang menerima parameter *multipart.FileHeader
untuk mengelola proses upload file.
Tentukan lokasi penyimpanan file dan buat direktori jika belum ada.
Return path file yang berhasil diunggah.
// src/helpers/upload.go
package helpers
import (
"fmt"
"mime/multipart"
"os"
"path/filepath"
"time"
)
func UploadFile(file *multipart.FileHeader) string {
// Tentukan lokasi penyimpanan file
uploadDir := "src/uploads"
epochTime := time.Now().Unix()
filePath := filepath.Join(uploadDir, fmt.Sprintf("%d_%s", epochTime, file.Filename))
// Buat direktori jika belum ada
if _, err := os.Stat(uploadDir); os.IsNotExist(err) {
os.Mkdir(uploadDir, os.ModePerm)
}
return filePath
}
Buat Helper untuk Validasi Ukuran dan Tipe File:
Buat fungsi SizeUploadValidation
untuk memeriksa apakah ukuran file tidak melebihi batas maksimal yang ditentukan.
Buat fungsi TypeUploadValidation
untuk memeriksa apakah tipe file sesuai dengan yang diizinkan.
Buat fungsi bantu isValidFileType
untuk memeriksa apakah tipe file valid.
// src/helpers/uploadValidation.go
package helpers
import (
"net/http"
"github.com/gofiber/fiber/v2"
)
func SizeUploadValidation(fileSize int64, maxFileSize int64) error {
if fileSize > maxFileSize {
return fiber.NewError(fiber.StatusRequestEntityTooLarge, "Ukuran file melebihi 2MB")
}
return nil
}
func TypeUploadValidation(buffer []byte, validFileTypes []string) error {
fileType := http.DetectContentType(buffer)
if !isValidFileType(validFileTypes, fileType) {
return fiber.NewError(fiber.StatusBadRequest, "Tipe file tidak valid. Hanya png, jpg, jpeg, dan pdf yang diperbolehkan.")
}
return nil
}
func isValidFileType(validFileTypes []string, fileType string) bool {
for _, validType := range validFileTypes {
if validType == fileType {
return true
}
}
return false
}
Buat Controller untuk Mengelola Upload File:
Buat fungsi UploadFile
di ProductController
untuk menangani permintaan upload file.
Validasi ukuran dan tipe file yang diunggah.
Simpan file di direktori lokal.
// src/controllers/ProductController.go
package controllers
import (
"fmt"
"gofiber/src/helpers"
"github.com/gofiber/fiber/v2"
)
func UploadFile(c *fiber.Ctx) error {
// Ambil file dari form
file, err := c.FormFile("file")
if err != nil {
return c.Status(fiber.StatusBadRequest).SendString("Gagal mengunggah file: " + err.Error())
}
// Validasi ukuran file (maksimal 2MB)
maxFileSize := int64(2 << 20) // 2MB
if err := helpers.SizeUploadValidation(file.Size, maxFileSize); err != nil {
return err
}
// Baca sebagian dari file untuk validasi tipe
fileHeader, err := file.Open()
if err != nil {
return c.Status(fiber.StatusInternalServerError).SendString("Gagal membuka file: " + err.Error())
}
defer fileHeader.Close()
buffer := make([]byte, 512)
if _, err := fileHeader.Read(buffer); err != nil {
return c.Status(fiber.StatusInternalServerError).SendString("Gagal membaca file: " + err.Error())
}
// Validasi tipe file
validFileTypes := []string{"image/png", "image/jpeg", "image/jpg", "application/pdf"}
if err := helpers.TypeUploadValidation(buffer, validFileTypes); err != nil {
return err
}
// Simpan file di direktori lokal
filePath := helpers.UploadFile(file)
if err := c.SaveFile(file, filePath); err != nil {
return c.Status(fiber.StatusInternalServerError).SendString("Gagal menyimpan file: " + err.Error())
}
return c.SendString(fmt.Sprintf("File %s berhasil diunggah ke %s", file.Filename, filePath))
}
Tambahkan Route untuk Upload File:
Tambahkan route baru untuk mengupload file di file routes/main.go
.
// src/routes/main.go
package routes
import (
"gofiber/src/controllers"
"gofiber/src/middlewares"
"github.com/gofiber/fiber/v2"
)
func Router(app *fiber.App) {
// Product routes
app.Get("/products", controllers.GetAllProducts)
app.Get("/product/:id", controllers.GetProductById)
app.Post("/product", controllers.CreateProduct)
app.Put("/product/:id", controllers.UpdateProduct)
app.Delete("/product/:id", controllers.DeleteProduct)
app.Post("/upload", controllers.UploadFile)
// Category routes
app.Get("/categories", middlewares.JwtMiddleware(), controllers.GetAllCategories)
app.Get("/category/:id", controllers.GetCategoryById)
app.Post("/category", controllers.CreateCategory)
app.Put("/category/:id", controllers.UpdateCategory)
app.Delete("/category/:id", controllers.DeleteCategory)
// User Routes
app.Post("/register", controllers.RegisterUser)
app.Post("/login", controllers.LoginUser)
app.Post("/refreshToken", controllers.RefreshToken)
}
Dengan langkah-langkah di atas, Anda telah berhasil mengimplementasikan fitur upload file di aplikasi Anda menggunakan Fiber dan Golang.