Gofiber
  • Basic backend dengan Gofiber part 1
    • Pengenalan Gofiber
    • Instalasi Gofiber
    • Auto reload dengan air
    • Membaca semua data di struct dengan Gofiber
    • Membaca data spesifik di struct dengan Gofiber
    • Membuat data di struct dengan Gofiber
    • Mengupdate data di struct dengan Gofiber
    • Menghapus data di struct dengan Gofiber
    • Implementasi MVC di Gofiber
  • Basic backend dengan Gofiber part 2
    • Setting database menggunahkan gorm.io di Gofiber
    • Menambahkan query ke database di Gofiber
    • Membuat relasi dengan gorm di Gofiber
    • Membuat validasi dengan validator di Gofiber
    • Membuat CORS di Gofiber
    • Menghandle serangan XSS(Cross-Site Scripting) di Gofiber
    • Mengamankan header HTTP dengan helmet di Gofiber
    • Membuat middleware menggunahkan JWT(JSON Web Token) di Gofiber
    • Menambahkan query search di Gofiber
    • Menambahkan query sort di Gofiber
    • Membuat pagination di Gofiber
    • Membuat refresh token di Gofiber
    • Membuat local upload file di Gofiber
    • Membuat server upload dengan cloudinary di Gofiber
    • Membuat analisis code dengan GolangCI-Lint di Gofiber
Powered by GitBook
On this page
  1. Basic backend dengan Gofiber part 2

Membuat local upload file di Gofiber

Langkah-langkah Implementasi Upload File di Local

  1. 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
    }
  2. 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
    }
  3. 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))
    }
  4. 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.

PreviousMembuat refresh token di GofiberNextMembuat server upload dengan cloudinary di Gofiber

Last updated 1 year ago

GitHub - zakimaliki/basic_gofiber_part_1 at d1b19890b44e22a2000c790674af9bfd74fae032GitHub
Logo