Как парсить форму multipart/form-data в Go с фреймворком echo?

Для парсинга формы с типом multipart/form-data в Go с использованием фреймворка Echo, вы можете воспользоваться встроенными функциями этого фреймворка.

Первым шагом вам понадобится настроить Middleware, чтобы Echo автоматически распознавал тип контента multipart/form-data. Для этого вы можете использовать функцию echo.Middleware с параметром echo.MultipartFormConfig. Например:

import (
    "net/http"

    "github.com/labstack/echo/v4"
    "github.com/labstack/echo/v4/middleware"
)

func main() {
    e := echo.New()
    
    e.Use(middleware.Logger())
    e.Use(middleware.Recover())
    e.Use(middleware.BodyLimit("2M")) // Ограничиваем размер тела запроса до 2 МБ
    
    e.Use(middleware.CORS()) // Middleware для обработки CORS
    
    // Конфигурация middleware для парсинга multipart/form-data
    e.Use(middleware.BodyLimit("32M")) // Ограничиваем размер контента до 32 МБ
    e.Use(middleware.MultipartWithConfig(middleware.MultipartConfig{
        MaxMemory: 32 * 1024 * 1024, // Ограничиваем размер в памяти до 32 МБ
    }))
    
    // Добавьте обработчики маршрутов здесь
    
    e.Start(":8080")
}

После настройки Middleware, вы можете добавить обработчик маршрута, который будет принимать данные из формы. Например:

func handleUpload(c echo.Context) error {
    // Получить файлы из формы
    files, err := c.FormFile("files") // files - это имя поля формы, в котором хранятся файлы
    if err != nil {
        // Обработка ошибки
        return err
    }
    
    // Для каждого файла можно выполнить необходимую обработку
    for _, file := range files {
        // Получить имя и расширение файла
        filename := file.Filename
        extension := filepath.Ext(filename)

        // Создать новый файл для сохранения
        dst, err := os.Create("uploads/" + filename)
        if err != nil {
            // Обработка ошибки
            return err
        }
        defer dst.Close()

        // Сохранить файл на сервер
        if err := c.SaveFile(file, dst); err != nil {
            // Обработка ошибки
            return err
        }
        
        // Выполнить дополнительную обработку файла здесь
    }
    
    // Возвратить успешный ответ
    return c.JSON(http.StatusOK, "Файлы успешно загружены")
}

func main() {
    e := echo.New()
    
    // Настройка Middleware и других настроек сервера
    
    // Добавление обработчика маршрута для загрузки файлов
    e.POST("/upload", handleUpload)
    
    e.Start(":8080")
}

В этом примере мы создали обработчик маршрута /upload, который ожидает получить файлы из формы с полем files. Затем мы проходим по каждому файлу и сохраняем его на сервере.

Важно помнить о безопасности при работе с загружаемыми файлами. Не забудьте провести необходимую валидацию и фильтрацию загружаемых файлов, чтобы предотвратить возможные атаки.