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"
élever
la source
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.

Richard J
la source
@ ɢʜʘʂʈʀɛɔʘɴ 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, ...

gris
la source
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

Lucas Liu
la source
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
Garçon rouge
la source