[БЕЗ_ЗВУКА] В этом видео мы рассмотрим загрузку файлов из формы и то, каким образом работать с ними, используя стандартную библиотеку в 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.