Как отправить multipart/form-data
с запросами в python? Как отправить файл, я понимаю, но как отправить данные формы этим способом не могу понять.
214
Как отправить multipart/form-data
с запросами в python? Как отправить файл, я понимаю, но как отправить данные формы этим способом не могу понять.
files
параметр используется для обеих целей, является очень плохим API. Я поднял вопрос под названием « Отправка многокомпонентных данных» - нам нужен лучший API, чтобы это исправить. Если вы согласны с тем, что использованиеfiles
параметра для отправки данных, состоящих из нескольких частей, в лучшем случае вводит в заблуждение, попросите изменить API в вышеуказанном выпуске.Ответы:
По сути, если вы укажете
files
параметр (словарь), тоrequests
отправитmultipart/form-data
POST вместоapplication/x-www-form-urlencoded
POST. Вы не ограничены использованием реальных файлов в этом словаре, однако:и httpbin.org позволяет узнать, с какими заголовками вы разместили; у
response.json()
нас есть:Более того, вы можете дополнительно контролировать имя файла, тип содержимого и дополнительные заголовки для каждой части, используя кортеж вместо единственной строки или объекта байтов. Ожидается, что кортеж будет содержать от 2 до 4 элементов; имя файла, содержимое, необязательно тип содержимого и необязательный словарь дополнительных заголовков.
Я бы использовал форму кортежа в
None
качестве имени файла, так чтоfilename="..."
параметр удаляется из запроса для этих частей:files
также может быть списком двухзначных кортежей, если вам нужно упорядочить и / или несколько полей с одинаковым именем:Если вы укажете оба
files
иdata
, то это зависит от значения того,data
что будет использоваться для создания тела POST. Еслиdata
это строка, будет использоваться только она; в противном случае обаdata
иfiles
используются, с элементами,data
перечисленными в первую очередь.Существует также отличный
requests-toolbelt
проект, который включает в себя расширенную поддержку Multipart . Он принимает определения полей в том же формате, что иfiles
параметр, но в отличие отrequests
него, по умолчанию он не устанавливает параметр имени файла. Кроме того, он может передавать запрос от открытых файловых объектов, гдеrequests
сначала будет построено тело запроса в памяти:Поля следуют тем же соглашениям; используйте кортеж с 2-4 элементами для добавления имени файла, части mime-типа или дополнительных заголовков. В отличие от
files
параметра, не делается попытка найтиfilename
значение по умолчанию, если вы не используете кортеж.источник
multipart/form-data
Content-Type должен включать граничное значение, используемое для разделения частей в теле сообщения. Не установкаContent-Type
заголовка гарантирует, чтоrequests
устанавливает его на правильное значение.multipart/form-data
если бы значениеfiles=
true было, поэтому, если вам нужно отправитьmultipart/form-data
запрос, но не включены какие-либо файлы, вы можете установить истинное, но бессмысленное значение, например{'':''}
, и установить вdata=
теле запроса. Если вы делаете это, не предоставляйтеContent-Type
заголовок самостоятельно;requests
установит это для вас. Вы можете увидеть проверку правды здесь: github.com/psf/requests/blob/…files
dict, они не должны быть файлами (просто убедитесь, что используете форму кортежа и установите имя файла вNone
). А еще лучше использоватьrequests_toolbelt
проект.Так как предыдущие ответы были написаны, запросы изменились. Посмотрите на ветку об ошибках на Github для более подробной информации и этот комментарий для примера.
Короче говоря, параметр files принимает a,
dict
ключом которого является имя поля формы, а значением является строка или кортеж длиной 2, 3 или 4, как описано в разделе POST - файл с многочастным кодированием в запросах. быстрый старт:В приведенном выше, кортеж составлен следующим образом:
Если значение является просто строкой, имя файла будет таким же, как и у ключа, как показано ниже:
Если значение является кортежем, а первая запись является
None
именем файла, свойство не будет включено:источник
name
иfilename
иметь несколько полей с одинаковыми именами?files
кортежа больше не работает:requests.post
data
вместо этого вам нужно использовать параметр для отправки дополнительных не файловыхmultipart/form-data
параметровNone
вместо пустой строки, кажется, работаетfiles
Этот параметр необходимо использовать для отправки POST-запроса из нескольких частей, даже если вам не нужно загружать какие-либо файлы.Из исходного источника запросов :
Соответствующая часть:
file-tuple can be a
2-tuple
, .3-tuple
or a
4-tuple
Исходя из вышеизложенного, простейший многочастный запрос формы, который включает в себя как файлы для загрузки, так и поля формы, будет выглядеть следующим образом:
☝ Обратите внимание на
None
первый аргумент в кортеже для текстовых полей - это заполнитель для поля имени файла, которое используется только для загрузки файлов, но для текстовых полей, передаваемыхNone
в качестве первого параметра, требуется для представления данных ,Несколько полей с одинаковым именем
Если вам нужно опубликовать несколько полей с одним и тем же именем, тогда вместо словаря вы можете определить свою полезную нагрузку в виде списка (или кортежа) кортежей:
API потоковых запросов
Если приведенный выше API не является достаточно питоническим для вас, рассмотрите возможность использования инструментального средства запросов (
pip install requests_toolbelt
), которое является расширением модуля основных запросов, который обеспечивает поддержку потоковой передачи файлов, а также MultipartEncoder, который можно использовать вместоfiles
, и который также позволяет Вы определяете полезную нагрузку как словарь, кортеж или список.MultipartEncoder
может использоваться как для составных запросов с фактическими полями загрузки, так и без них. Он должен быть назначенdata
параметру.Если вам нужно отправить несколько полей с одним и тем же именем или если важен порядок полей формы, то вместо словаря можно использовать кортеж или список:
источник
file.py
находится в той же папке, что и ваш скрипт.None
вместо пустой строки. Тогда запросы не будут включать имя файла вообще. Так что вместоContent-Disposition: form-data; name="action"; filename=""
этого будетContent-Disposition: form-data; name="action"
. Для меня было важно, чтобы сервер принимал эти поля как поля формы, а не как файлы.Вот простой фрагмент кода для загрузки одного файла с дополнительными параметрами с использованием запросов:
Обратите внимание, что вам не нужно явно указывать какой-либо тип контента.
ПРИМЕЧАНИЕ. Хотел прокомментировать один из приведенных выше ответов, но не смог из-за низкой репутации, поэтому подготовил новый ответ здесь.
источник
Вам нужно использовать
name
атрибут файла загрузки, который находится в HTML-коде сайта. Пример:Видишь
name="image">
? Вы можете найти его в HTML-коде сайта для загрузки файла. Вы должны использовать его для загрузки файла сMultipart/form-data
сценарий:
Здесь вместо изображения добавьте название загружаемого файла в HTML
Если при загрузке требуется нажать кнопку загрузки, вы можете использовать вот так:
Затем запустите запрос
И готово, файл успешно загружен
источник
Отправить ключ и значение multipart / form-data
команда curl:
Python- запросы - более сложные POST-запросы :
Отправить файл multipart / form-data
команда curl:
запросы Python - POST файл, закодированный в нескольких частях :
вот и все.
источник
Вот фрагмент кода Python, который вам нужен для загрузки одного большого файла в виде составных данных. С промежуточным программным обеспечением NodeJs Multer, работающим на стороне сервера.
Для серверной стороны, пожалуйста, проверьте документацию multer по адресу: https://github.com/expressjs/multer, здесь одиночное поле ('fieldName') используется для принятия одного файла, как в:
источник