Comment envoyer un multipart/form-data
avec des demandes en python? Comment envoyer un fichier, je comprends, mais comment envoyer les données du formulaire par cette méthode ne peut pas comprendre.
214
Comment envoyer un multipart/form-data
avec des demandes en python? Comment envoyer un fichier, je comprends, mais comment envoyer les données du formulaire par cette méthode ne peut pas comprendre.
files
paramètre soit utilisé pour faire les deux est une très mauvaise API. J'ai soulevé un problème intitulé Envoi de données en plusieurs parties - nous avons besoin d'une meilleure API pour résoudre ce problème. Si vous acceptez que l'utilisation defiles
paramètres pour envoyer des données en plusieurs parties est au mieux trompeuse, veuillez demander de changer l'API dans le problème ci-dessus.Réponses:
Fondamentalement, si vous spécifiez un
files
paramètre (un dictionnaire), puisrequests
enverra unmultipart/form-data
POST au lieu d'unapplication/x-www-form-urlencoded
POST. Cependant, vous n'êtes pas limité à l'utilisation de fichiers réels dans ce dictionnaire:et httpbin.org vous permet de savoir avec quels en-têtes vous avez posté; en
response.json()
nous avons:Mieux encore, vous pouvez contrôler davantage le nom de fichier, le type de contenu et les en-têtes supplémentaires pour chaque partie en utilisant un tuple au lieu d'une seule chaîne ou d'un seul octet. Le tuple devrait contenir entre 2 et 4 éléments; le nom de fichier, le contenu, éventuellement un type de contenu, et un dictionnaire facultatif d'autres en-têtes.
J'utiliserais le formulaire tuple avec
None
comme nom de fichier, de sorte que lefilename="..."
paramètre soit supprimé de la demande pour ces parties:files
peut également être une liste de tuples à deux valeurs, si vous avez besoin de commander et / ou de plusieurs champs avec le même nom:Si vous spécifiez les deux
files
etdata
, cela dépend de la valeur dedata
ce qui sera utilisé pour créer le corps POST. Sidata
est une chaîne, seule elle sera utilisée; sinon les deuxdata
etfiles
sont utilisés, avec les élémentsdata
énumérés en premier.Il y a aussi l'excellent
requests-toolbelt
projet, qui inclut un support avancé en plusieurs parties . Il prend les définitions de champ dans le même format que lefiles
paramètre, mais contrairement àrequests
, il ne prend pas par défaut la valeur d'un paramètre de nom de fichier. De plus, il peut diffuser la demande à partir d'objets de fichier ouverts, oùrequests
va d'abord construire le corps de la demande en mémoire:Les champs suivent les mêmes conventions; utilisez un tuple avec entre 2 et 4 éléments pour ajouter un nom de fichier, une partie de type mime ou des en-têtes supplémentaires. Contrairement au
files
paramètre, aucune tentative n'est faite pour trouver unefilename
valeur par défaut si vous n'utilisez pas de tuple.la source
multipart/form-data
Content-Type doit inclure la valeur limite utilisée pour délimiter les pièces dans le corps du message. Le fait de ne pas définir l'en-Content-Type
tête garantit qu'il lerequests
définit à la valeur correcte.multipart/form-data
si la valeur defiles=
est véridique, donc si vous avez besoin d'envoyer unemultipart/form-data
demande mais n'incluez aucun fichier, vous pouvez définir une valeur véridique mais dénuée de sens telle que{'':''}
, et définirdata=
avec votre corps de demande. Si vous faites cela, ne fournissez pas l'Content-Type
en-tête vous-même;requests
le définira pour vous. Vous pouvez voir la vérification de la vérité ici: github.com/psf/requests/blob/…files
dict, ils ne doivent pas nécessairement être des fichiers (assurez-vous simplement d'utiliser le formulaire tuple et définissez le nom de fichier surNone
). Mieux encore, utilisez lerequests_toolbelt
projet.Depuis que les réponses précédentes ont été écrites, les demandes ont changé. Jetez un œil au fil de bogue sur Github pour plus de détails et ce commentaire pour un exemple.
En bref, le paramètre files prend un
dict
avec la clé étant le nom du champ du formulaire et la valeur étant soit une chaîne soit un tuple de 2, 3 ou 4 longueurs, comme décrit dans la section POST un fichier codé en plusieurs parties dans les requêtes démarrage rapide:Dans ce qui précède, le tuple est composé comme suit:
Si la valeur n'est qu'une chaîne, le nom de fichier sera le même que la clé, comme dans l'exemple suivant:
Si la valeur est un tuple et que la première entrée est
None
la propriété de nom de fichier ne sera pas incluse:la source
name
etfilename
mais également avoir plusieurs champs avec le même nom?files
tuple ne fonctionne plus: vous devez utiliser unrequests.post
data
paramètre à la place pour envoyer desmultipart/form-data
paramètres non-fichier supplémentairesNone
au lieu d'une chaîne vide semble fonctionnerVous devez utiliser le
files
paramètre pour envoyer une demande POST de formulaire en plusieurs parties même lorsque vous n'avez pas besoin de télécharger de fichiers.De la source des demandes d' origine:
La partie pertinente est:
file-tuple can be a
2-tuple
, .3-tuple
or a
4-tuple
Sur la base de ce qui précède, la demande de formulaire en plusieurs parties la plus simple qui comprend à la fois les fichiers à télécharger et les champs de formulaire ressemblera à ceci:
☝ Notez le
None
comme premier argument dans le tuple pour les champs de texte brut - il s'agit d'un espace réservé pour le champ de nom de fichier qui n'est utilisé que pour les téléchargements de fichiers, mais pour les champs de texte passantNone
comme premier paramètre est requis pour que les données soient soumises .Plusieurs champs avec le même nom
Si vous devez publier plusieurs champs avec le même nom, au lieu d'un dictionnaire, vous pouvez définir votre charge utile comme une liste (ou un tuple) de tuples:
API de requêtes de streaming
Si l'API ci-dessus n'est pas assez pythonique pour vous, alors envisagez d'utiliser la barre d' outils de requêtes (
pip install requests_toolbelt
) qui est une extension du module de requêtes principal qui prend en charge le streaming de téléchargement de fichiers ainsi que le MultipartEncoder qui peut être utilisé à la place defiles
, et qui permet également vous définissez la charge utile comme un dictionnaire, un tuple ou une liste.MultipartEncoder
peut être utilisé à la fois pour les demandes en plusieurs parties avec ou sans champs de téléchargement réels. Il doit être affecté audata
paramètre.Si vous devez envoyer plusieurs champs avec le même nom, ou si l'ordre des champs du formulaire est important, alors un tuple ou une liste peut être utilisé à la place d'un dictionnaire:
la source
file.py
se trouve dans le même dossier que votre script.None
au lieu d'une chaîne vide. Les demandes n'incluront alors aucun nom de fichier. Au lieu deContent-Disposition: form-data; name="action"; filename=""
cela, ce sera le casContent-Disposition: form-data; name="action"
. C'était essentiel pour moi que le serveur accepte ces champs comme champs de formulaire et non comme fichiers.Voici l'extrait de code simple pour télécharger un seul fichier avec des paramètres supplémentaires à l'aide de requêtes:
Veuillez noter que vous n'avez pas besoin de spécifier explicitement un type de contenu.
REMARQUE: Je voulais commenter l'une des réponses ci-dessus, mais je n'ai pas pu le faire en raison de sa faible réputation, j'ai donc rédigé une nouvelle réponse ici.
la source
Vous devez utiliser l'
name
attribut du fichier de téléchargement qui se trouve dans le code HTML du site. Exemple:Tu vois
name="image">
? Vous pouvez le trouver dans le code HTML d'un site pour télécharger le fichier. Vous devez l'utiliser pour télécharger le fichier avecMultipart/form-data
scénario:
Ici, à la place de l'image, ajoutez le nom du fichier upload en HTML
Si le téléchargement nécessite de cliquer sur le bouton de téléchargement, vous pouvez utiliser comme ça:
Ensuite, lancez la demande
Et terminé, le fichier a été téléchargé avec succès
la source
Envoyer la clé et la valeur multipart / form-data
commande curl:
requêtes python - Requêtes POST plus compliquées :
Envoyer un fichier multipart / form-data
commande curl:
requêtes python - POST un fichier codé en plusieurs parties :
c'est tout.
la source
Voici l'extrait de code python dont vous avez besoin pour télécharger un grand fichier unique en tant que données de formulaire en plusieurs parties. Avec le middleware NodeJs Multer exécuté côté serveur.
Pour le côté serveur, veuillez consulter la documentation du multer sur: https://github.com/expressjs/multer ici le champ single ('fieldName') est utilisé pour accepter un seul fichier, comme dans:
la source