331 votes

Envoyer une requête à cURL avec des données postales provenant d'un fichier

Je dois faire une demande POST via cURL à partir de la ligne de commande. Les données de cette requête se trouvent dans un fichier. Je sais que cela peut être fait via PUT avec la commande --upload-file option.

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

0 votes

1 votes

Désolé, j'ai peut-être mal décrit mon problème, j'ai besoin d'envoyer une requête non pas via php-curl mais juste via une commande curl en ligne de commande depuis un système Linux.

1 votes

487voto

Richard J Points 826

Vous cherchez le --data-binary argument :

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

Dans l'exemple ci-dessus, -i imprime tous les en-têtes afin que vous puissiez voir ce qui se passe, et -X POST indique explicitement qu'il s'agit d'un poste. Ces deux éléments peuvent être omis en toute sécurité sans modifier le comportement sur le fil. Le chemin d'accès au fichier doit être précédé d'un signe @ symbole, donc curl sait lire à partir d'un fichier.

0 votes

@ dans ce cas, ce serait .xml

70 votes

Le site @ est extrêmement important !

0 votes

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.

78voto

Gray Points 58585

Je dois faire une demande POST via Curl à partir de la ligne de commande. Les données pour cette requête sont situées dans un fichier...

Tout ce que vous devez faire est d'avoir le --data commencent par un @ :

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.xml alors vous feriez quelque chose comme :

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

Le site stuff.xml filename peut être remplacé par un chemin relatif ou complet vers le fichier : @../xml/stuff.xml , @/var/tmp/stuff.xml , ...

4 votes

Dans le cas où vous avez besoin d'envoyer un champ nommé, vous pouvez également utiliser --data "name@stuff" .

0 votes

Une solution très astucieuse ! 100%

23voto

Lucas Liu Points 295

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

7voto

Red Boy Points 1894

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 manquant c'est-à-dire qu'en général, il ne s'agit pas seulement d'un fichier que vous chargez, vous pouvez en avoir plusieurs. éléments de données du formulaire , comme le commentaire au fichier ou les balises au fichier etc. comme ce fut mon cas. C'est pourquoi j'aimerais l'ajouter ici, comme c'était mon cas, afin que cela puisse aider d'autres personnes.

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

1voto

J'ai dû utiliser une connexion HTTP, car sur HTTPS il y a une limite de taille de fichier par défaut.

https://techcommunity.microsoft.com/t5/IIS-Support-Blog/Solution-for-Request-Entity-Too-Large-error/ba-p/501134

    curl -i -X 'POST' -F 'file=@/home/testeincremental.xlsx' 'http://example.com/upload.aspx?user=example&password=example123&type=XLSX'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X