Envoyer une requête POST avec les données spécifiées dans le fichier via Curl


242

J'ai besoin de faire une demande POST via Curl à partir de la ligne de commande. Les données de cette demande se trouvent dans un fichier. Je sais que via PUT, cela pourrait être fait avec l' --upload-fileoption.

curl host:port/post-file -H "Content-Type: text/xml" --data "contents_of_file"


1
Désolé peut-être que j'ai décrit par erreur mon problème, je dois envoyer la demande non pas via php-curl mais simplement via la commande curl à partir de la ligne de commande de Linux OS.
raceish

Réponses:


365

Vous recherchez l' --data-binaryargument:

curl -i -X POST host:port/post-file \
  -H "Content-Type: text/xml" \
  --data-binary "@path/to/file"

Dans l'exemple ci-dessus, -iimprime tous les en-têtes pour que vous puissiez voir ce qui se passe et -X POSTexplicite qu'il s'agit d'un article. Ces deux éléments peuvent être supprimés en toute sécurité sans modifier le comportement du câble. Le chemin d'accès au fichier doit être précédé d'un @symbole, donc curlsait lire à partir d'un fichier.


@ ɢʜʘʂʈʀɛɔʘɴ dans ce cas ce serait.xml
dennismonsewicz

54
la @partie est extrêmement importante!
Ron Klein

Nous utilisons donc le paramètre --data-binary, mais le contenu réel du fichier peut être du texte? Puisque XML n'est pas typiquement binaire.
David

8
en fait, vous pouvez utiliser le drapeau juste -d
Anatoly Yakimchuk

16
@ Tol182 -dentraînera la suppression des curlnouvelles lignes, mais --data-binaryce ne sera pas le cas.
Acumenus

45

J'ai besoin de faire une demande POST via Curl à partir de la ligne de commande. Les données de cette demande se trouvent dans un fichier ...

Tout ce que vous devez faire est de --datacommencer l' argument par @:

curl -H "Content-Type: text/xml" --data "@path_of_file" host:port/post-file-path

Par exemple, si vous avez les données dans un fichier appelé, stuff.xmlvous feriez quelque chose comme:

curl -H "Content-Type: text/xml" --data "@stuff.xml" host:port/post-file-path

Le stuff.xmlnom de fichier peut être remplacé par un chemin complet ou relatif au fichier: @../xml/stuff.xml, @/var/tmp/stuff.xml, ...


2
Si vous devez envoyer un champ nommé, vous pouvez également utiliser --data "name@stuff".
Hermann

15

Si vous utilisez des données de formulaire pour télécharger un fichier, dans lequel un nom de paramètre doit être spécifié, vous pouvez utiliser:

curl -X POST -i -F "parametername=@filename" -F "additional_parm=param2" host:port/xxx


Je vous remercie! La 1. solution n'a pas fonctionné pour moi. parametername=m'a vraiment aidé :)
Cyborg

3

La plupart des réponses sont parfaites ici, mais quand j'ai atterri ici pour mon problème particulier, je dois télécharger un fichier binaire (feuille de calcul XLSX) en utilisant la méthode POST, je vois une chose manquante , c'est-à-dire que ce n'est généralement pas seulement le fichier que vous chargez, vous pouvez avoir plus d' éléments de données de formulaire , comme des commentaires dans un fichier ou des balises dans un fichier, etc., comme c'était mon cas. Par conséquent, je voudrais l'ajouter ici car c'était mon cas d'utilisation, afin qu'il puisse aider les autres.

curl -POST -F comment=mycomment -F file_type=XLSX -F file_data=@/your/path/to/file.XLSX http://yourhost.example.com/api/example_url

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.