317

I am using cURL command line utility to send HTTP POST to a web service. I want to include a file's contents as the body entity of the POST. I have tried using -d </path/to/filename> as well as other variants with type info like --data </path/to/filename> --data-urlencode </path/to/filename> etc... the file is always attached. I need it as the body entity.

Roy Hinkley
  • 10,111
  • 21
  • 80
  • 120

4 Answers4

526

I believe you're looking for the @filename syntax, e.g.:

strip new lines

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

keep new lines

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

curl will strip all newlines from the file. If you want to send the file with newlines intact, use --data-binary in place of --data

derekerdmann
  • 17,696
  • 11
  • 76
  • 110
Jeffrey Froman
  • 6,113
  • 1
  • 16
  • 11
  • 28
    If you want to be real fancy you can do: `cat file.txt | curl --data "@-" \`(< url.txt )\`` `@-` tells curl to read from stdin. You could also just use the redirect `(< x.txt )` to put in whatever you want. If you're using bash. – Breedly Apr 29 '15 at 21:44
  • 70
    curl will strip all newlines from the file. If you want to send the file with newlines intact, use `--data-binary` in place of `--data`. – Chris May 14 '15 at 23:27
  • now how would one add login credentials to authorize this request? – fIwJlxSzApHEZIl Jul 20 '17 at 21:14
  • @anon58192932 - That depends upon the security protocol of the server. If you are using `name:value` pairs, like a username and password, then add the necessary headers that match what the service is expecting: `--header: ":"` as a single string. – Roy Hinkley Jul 27 '17 at 18:36
34

I know the question has been answered, but in my case I was trying to send the content of a text file to the Slack Webhook api and for some reason the above answer did not work. Anywho, this is what finally did the trick for me:

curl -X POST -H --silent --data-urlencode "payload={\"text\": \"$(cat file.txt | sed "s/\"/'/g")\"}" https://hooks.slack.com/services/XXX
cookiedough
  • 3,552
  • 2
  • 26
  • 51
  • This one does not convert dots to underscores (. -> _) and keeps newlines. Thanks! – Ramon Fincken Oct 18 '18 at 13:49
  • 1
    It's cool, but it doesn't answer the question since the file is exploded on the command line instead of being specified for curl. I'm also wondering if all of the shell's special characters need to be escaped -- but I don't know enough about that ;) – Gerard ONeill Jun 10 '19 at 14:59
  • 4
    For a huge content file, above curl won't work, `curl: argument list too long` in that case accepted answer is life saver `curl --data "@/path/to/filename" http://...` – Another coder Jun 26 '20 at 02:51
18

In my case, @ caused some sort of encoding problem, I still prefer my old way:

curl -d "$(cat /path/to/file)" https://example.com
Kacifer
  • 1,334
  • 17
  • 26
-6

curl https://upload.box.com/api/2.0/files/3300/content -H "Authorization: Bearer $access_token" -F file=@"C:\Crystal Reports\Crystal Reports\mysales.pdf"