Membuat local upload file di Gofiber
Langkah-langkah Implementasi Upload File di Local
// 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 }// 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 }// 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)) }// 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) }
Last updated