LINUX.ORG.RU

Валидация multipart/form-data в Gin/Gonic (Golang)

 ,


0

2

Не получается валидировать multipart/form-data. Есть два поля: img (картинка) и alt (текст). Как правильно валидировать ситуацию, когда юзер картинку не передает? Делаю вот так:

type ImageUploadForm struct {
	Alt    string `form:"alt" binding:"required"`
	Img  *multipart.FileHeader `form:"img" binding:"required"`
}

func (ctr *imagesController) Upload(c *gin.Context) {
	var imgForm forms.ImageUploadForm
	if err := c.MustBindWith(&imgForm, binding.FormMultipart); err != nil {
		c.Error(err)
		return
	}
        /// Тут дальше обработка, к проблеме уже не относится
}

Код довольно сильно упростил, но, думаю, понятно. Проблема в том, что так не работает. То есть если не указать alt при сабмите формы, то MustBindWith кидает ошибку - все в порядке. Но если не отправлять файл в img, то MustBindWith ошибку почему-то не возвращает. Вопрос: почему и как сделать правильно?

P.s. в заголовке Content-Type передаю multipart/form-data - тут все ок

★★

Последнее исправление: dimuska139 (всего исправлений: 1)

Сразу попрошу воздержаться от комментариев по поводу Rust vs Go, асинхронный Python vs Go, в Go фреймворки не нужны и т.п. :)

dimuska139 ★★
() автор топика
Ответ на: комментарий от derlafff

Ну да, в контроллерах руками проверять каждое поле - это так себе вариант. Можно, конечно, попробовать запилить кастомный тег - и там проверять на nil, но я подумал, может как-то required можно юзать в данном случае.

dimuska139 ★★
() автор топика
Ответ на: комментарий от dimuska139

Я не очень понял, что там происходит, но посмотри их тест на эту проблему: https://github.com/gin-gonic/gin/blob/66d2c30c54ff8042f5ae13d9ebb26dfe556561fe/binding/binding_test.go#L530

Возможно, поможет.

Есть вероятность, что это баг и его нужно зарепортить.

derlafff ★★★★★
()
Последнее исправление: derlafff (всего исправлений: 1)
Ответ на: комментарий от derlafff

Там недавно вышла новая версия Gin - 1.4.0, и они там это поправили - ошибку кидает. Но теперь проблема в том, что при отсутствии файла кидает ошибку не того типа, что при не заполненном поле с текстом. И не установить, какое именно поле эту ошибку кинуло. Я открыл issue в их репозитории.

dimuska139 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.