0:00
[БЕЗ_ЗВУКА] В
этом видео мы рассмотрим загрузку файлов из формы и то,
каким образом работать с ними, используя стандартную библиотеку в go.
Рассмотрим следующий код.
У меня есть очень простая форма, в которой только один input file и submit.
Я, не стесняясь, просто сразу ее вывожу на экран.
Вот как это выглядит.
Вот моя форма и кнопка.
Выберем файл и загрузим.
В данном случае мы видим какую-то информацию,
которую я вывел по этому файлу.
Это имя самого файла, заголовки MIMEHeader-а и MD5 от файла.
Теперь рассмотрим код, который эту информацию выводит.
Вот наша функция, которая работает с этим обработчиком.
Итак, в go весь запрос, он не вычитывается, не парсится по умолчанию.
Вам нужно либо самим его сказать,
что загрузи и обработай, либо он будет загружен по умолчанию при первом обращении
к каким-то определенным фолям и функциям реквеста.
Итак, в данном случае я занимаюсь парсингом формы, говорю,
что мне, пожалуйста, распарсь только пять мегабайт,
и если что-то там остается, оно будет положено во временные файлы.
После этого у реквеста есть функция FormFile,
где я обращаюсь к своему файлу и получаю, собственно,
сами данные и какие-то заголовки от файла.
Дело в том, что там Multipart, и этим занимается MIME парсер.
Вот.
После я, конечно же, файл сразу закрываю через defer,
это надо, чтобы не текли ресурсы и прочее.
Вот. Ну и печатаю это на экран.
Вот в данном случае я печатаю имя,
дальше я печатаю MIME заголовок, который шел в форме.
После этого я пытаюсь как-то посчитать MD5 от этого файла.
Я создаю новый объект из пакета crypto/md5
и туда скармливаю, собственно, свой файл.
Этот алгоритм хеширования, ну, в данном случае это структура такая,
туда можно скопировать прямо данные, он принимает его ридер, и он посчитает MD5.
И вот тут я его вывожу.
В hasher.Sum то есть уже сами данные, nil я передаю — это значит,
что я хочу не передать туда и посчитать сразу, а то,
что я туда налил через ее код.
Вот.
Это когда у вас файлов много, и вы хотите их распарсить и сразу иметь все данные.
Еще одна достаточно частая операция, когда у вас в POST-запросе приходят данные,
которые вы не хотите парсить через MIME, то есть это не...
не multipart/form-data, а, например, application/json.
В этом случае вы тоже можете просто считать весь реквест в свой код, да?
Прямо вот как он есть, нераспаршенный вид.
И что-то с ним сделать.
Рассмотрим код.
Вот я паршу реквест напрямую, я не пользуюсь никакими
вспомогательными функциями, я просто читаю все, что есть в body.
Вот он у меня есть, сразу же его в defer закрываю.
После этого я...
да, данные я буду передавать вот такие, то есть просто json, прямо, как есть.
Дальше я создаю структуру и паршу json в эту структуру.
Есть какая-то ошибка, я отвечаю 500, ну а дальше вывожу Content-Type и то,
что я туда распарсил.
Рассмотрим это в работе.
Вот мой запрос, то есть я его загружаю через POST, указываю Content-Type
application/json, дальше я его не проверяю, но вы можете на это смотреть.
Вот. Вот тут сами данные, которые я передаю,
и адрес, куда мне идти.
Нажимаем Enter.
Отлично, все прошло.
Content-Type application/json, который я передал, а вот результа парсинга,
то есть params, params &main и ID:2, User: "rvasily".
Вот.
Так можно парсить формы и получать файлы,
которые вы загружаете, используя стандартную библиотеку в go.