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.

Roy Hinkley
la source

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

Jeffrey Froman
la source
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
Cookiedough
la source
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
wbswjc
la source