12

I have a server API that I have developed against the format used by Fiddler to do HTTP posts of files, which is a multipart/form-data post. I'm trying to get curl to do something similar (so I can stop using Fiddler for testing and instead have a separate program call out to curl programmatically).

Here is how it's set up in Fiddler, which is what I need to replicate. The file being uploaded is myfile.html file:

---------------------------acebdf13572468
Content-Disposition: form-data; name="fieldNameHere"; filename="myfile.html"
Content-Type: text/html

<@INCLUDE *C:\myfiles\myfile.html*@>
---------------------------acebdf13572468--

I need for curl to produce something similar: in particular the name= part, followed by the file content at the bottom of this part. I've tried this with:

curl -F "fieldNameHere=myfile.html" http://myapi.com/

When I do that, it seems to totally ignore my file though. Here's the verbose output if I add -v:

POST / HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Host: perl-h4.factset.io
Accept: */*
Content-Length: 166
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------981301fdaeb3

There isn't any file content at all (it's a large HTML file). So I think there might be something fundamental I'm missing here. Any pointers would be quite welcome.

Also, I have checked other Stack Overflow questions, like this: What is the right way to POST multipart/form-data using curl?

But they are basically saying to do something like what I'm doing here. So maybe the problem is not my syntax, but some other reason it doesn't want to read the file.

2 Answers 2

25

Use:

curl -X POST  -F [email protected]  http://myapi.com/

or

-X POST is implied by -F (per comment), and quotes are optional

curl -F "[email protected]"  http://myapi.com/
Sign up to request clarification or add additional context in comments.

3 Comments

but no bonus points with the superfluous -X POST present there... =)
Oh wow, so the problem is just that I was missing an @ sign. Amazing... thanks. I guess that tells curl that this is the name of an actual file?
Yes pretty much.
11

For more complex requests:

curl
 -X POST "YOUR_API_URL"
 -H "Authorization: Bearer YOUR_TOKEN"
 -H "Accept: application/json"
 -H "Content-Type: multipart/form-data"
 -F "meta={\"YOUR_ATTRIBUTE\": \"YOUR_DATA\"};type=application/json"
 -F "text=PATH_TO_FILE;type=text/plain"

You can set several chunks together into one request. For more, check out Add blobs to objects in Azure Digital Twins!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.