5

I want to do an HTTP POST of the contents (as a string) of a local file located at path/to/my-file.txt to a URL endpoint at http://example.com/.

For example, I might want to do the following:

  1. Extract the contents of the file my-file.txt as a string.
  2. URL encode the string.
  3. Store the encoded string as a variable named foo.

Then do something like this:

curl -d "data=foo" http://example.com/

(I don't actually need the foo variable. It's just a convenient way to describe my question.)

What are the commands I would need to execute this? Do I need to write a shell script? If so, how might it look?

9

According to the last section of -d in man curl:

If you start the data with the letter @, the rest should be a file name to read the data from, or - if you want curl to read the data from stdin. Multiple files can also be specified. Posting data from a file named 'foobar' would thus be done with --data @foobar. When --data is told to read from a file like that, carriage returns and newlines will be stripped out.

That is you don't have to do anything fancy just prepend your filename with a @.

  • 2
    And if you want some useful shell escaping (eg. to use jq to preprocess some JSON, try: curl ... -d @<(jq '{"schema": . | tostring }' myschema.avsc') Use-case: wrap a JSON document into a string of another JSON document to pass it to a REST API. (Confluent Schema Registry) – Cameron Kerr Jun 15 '18 at 0:14
5

To be explicitly clear, the accepted answer suggests:

curl -d "data=@path/to/my-file.txt" http://example.com/

The manual reference is here. (Search the page for -d, --data <data>).

Also see this SE answer and this one also for multi-parts.

0

As mentioned in this related question if you want the file uploaded without any changes (carriage return/line feed removal) then you may want to use the --data-binary option:

curl -X POST --data-binary @path/to/my-file.txt http://example.com/

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.