Comment envoyer le contenu d'un fichier en tant qu'entité de corps en utilisant cURL


208

J'utilise l'utilitaire de ligne de commande cURL pour envoyer HTTP POST à ​​un service Web. Je souhaite inclure le contenu d'un fichier en tant qu'entité de corps du POST. J'ai essayé d'utiliser -d </path/to/filename>ainsi que d'autres variantes avec des informations de type comme --data </path/to/filename> --data-urlencode </path/to/filename>etc ... le fichier est toujours joint. J'en ai besoin comme entité corporelle.

Réponses:


339

Je pense que vous recherchez la @filenamesyntaxe, par exemple:

dépouiller de nouvelles lignes

curl --data "@/path/to/filename" http://...

garder de nouvelles lignes

curl --data-binary "@/path/to/filename" http://...

=====

curl supprimera toutes les nouvelles lignes du fichier. Si vous souhaitez envoyer le fichier avec des retours à la ligne intacts, utilisez --data-binaryà la place de --data


21
Si vous voulez être vraiment fantaisiste, vous pouvez le faire: cat file.txt | curl --data "@-" `(< url.txt )` @-dit à curl de lire depuis stdin. Vous pouvez également utiliser la redirection (< x.txt )pour mettre ce que vous voulez. Si vous utilisez bash.
Breedly

62
curl supprimera toutes les nouvelles lignes du fichier. Si vous souhaitez envoyer le fichier avec des retours à la ligne intacts, utilisez --data-binaryà la place de --data.
Chris

maintenant, comment ajouter des informations de connexion pour autoriser cette demande?
anon58192932

@ anon58192932 - Cela dépend du protocole de sécurité du serveur. Si vous utilisez des name:valuepaires, comme un nom d'utilisateur et un mot de passe, ajoutez les en-têtes nécessaires qui correspondent à ce que le service attend: --header: "<header_name>:<header_value>"comme une seule chaîne.
Roy Hinkley

19

Je sais que la question a été répondue, mais dans mon cas, j'essayais d'envoyer le contenu d'un fichier texte à l' API Slack Webhook et pour une raison quelconque, la réponse ci-dessus n'a pas fonctionné. Quoi qu'il en soit, c'est ce qui a finalement fait l'affaire pour moi:

curl -X POST -H --silent --data-urlencode "payload={\"text\": \"$(cat file.txt | sed "s/\"/'/g")\"}" https://hooks.slack.com/services/XXX

Celui-ci ne convertit pas les points en traits de soulignement (. -> _) et conserve les nouvelles lignes. Merci!
Ramon Fincken

1
C'est cool, mais cela ne répond pas à la question car le fichier est éclaté sur la ligne de commande au lieu d'être spécifié pour curl. Je me demande aussi si tous les caractères spéciaux du shell doivent être échappés - mais je n'en sais pas assez à ce sujet;)
Gerard ONeill

Merci, vous m'avez sauvé la vie!
aryswisnu

Pour un fichier de contenu énorme, la boucle ci-dessus ne fonctionnera pas, curl: argument list too longdans ce cas, la réponse acceptée est le sauveur de viecurl --data "@/path/to/filename" http://...
Un autre codeur

0

Dans mon cas, @causé une sorte de problème d'encodage, je préfère toujours mon ancienne méthode:

curl -d "$(cat /path/to/file)" https://example.com
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.