Say I upload a file with PHP, CURL:
$postData = array();
$postData['file_name'] = "test.txt";
$postData['submit'] = "UPLOAD";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1 );
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData );
Now assume I have to manually set the content-length header.
$headers=array(
"POST /rest/objects HTTP/1.1",
'accept: */*',
"content-length: 0" //instead of 0, how could I get the length of the body from curl?
)
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //set headers
$response = curl_exec($ch);
How would I measure the size of the body? (just specifying the filesize as content length doesn’t seem to work)
In another example what if the body contains data that is not an actual file. (manually set by postfields) In that situation how would I get the content length of the body?
Thanks for any light shed on this, it appears to be a tough issue.
To get the length of a post body, try formatting the fields int a GET style string (aka
param1=value1¶m2=value2) then setting that string as theCURL_POSTFIELDSwithcurl_setopt. An array does not have to be supplied. You can simply usestrlen()to get the value to use for the content-length header.If you are posting a file (or files) in addition to other fields, as you appear to be in the example above, you have to supply the value for the file as
@/path/to/file, then get the filesize in bytes and add that to the total content-length.So for the above example, assuming the file
test.txtis in the/test dirof your server, the post value string would befile_name=@/test/text.txt&submit=UPLOAD. You MUSTurl_encodethis string as well, before you assign it as the curl post value. To get the content length you get the length of that string (post url-encoding) and add it to the filesize of/test/test.txt.