POST a file string using cURL in PHP?
Should be possible: here's a form, posted through a browser (irrelevant fields omitted):
POST http://host.example.com/somewhere HTTP/1.1Content-Type: multipart/form-data; boundary=---------------------------7da16b2e4026cContent-Length: 105732-----------------------------7da16b2e4026cContent-Disposition: form-data; name="NewFile"; filename="test.jpg"Content-Type: image/jpeg(...raw JPEG data here...)-----------------------------7da16b2e4026cContent-Disposition: form-data; name="otherformfield"content of otherformfield is this text-----------------------------7da16b2e4026c--
So, if we build the POST body ourselves and set an extra header or two, we should be able to simulate this:
// form field separator$delimiter = '-------------' . uniqid();// file upload fields: name => array(type=>'mime/type',content=>'raw data')$fileFields = array( 'file1' => array( 'type' => 'text/plain', 'content' => '...your raw file content goes here...' ), /* ... */);// all other fields (not file upload): name => value$postFields = array( 'otherformfield' => 'content of otherformfield is this text', /* ... */);$data = '';// populate normal fields first (simpler)foreach ($postFields as $name => $content) { $data .= "--" . $delimiter . "\r\n"; $data .= 'Content-Disposition: form-data; name="' . $name . '"'; // note: double endline $data .= "\r\n\r\n";}// populate file fieldsforeach ($fileFields as $name => $file) { $data .= "--" . $delimiter . "\r\n"; // "filename" attribute is not essential; server-side scripts may use it $data .= 'Content-Disposition: form-data; name="' . $name . '";' . ' filename="' . $name . '"' . "\r\n"; // this is, again, informative only; good practice to include though $data .= 'Content-Type: ' . $file['type'] . "\r\n"; // this endline must be here to indicate end of headers $data .= "\r\n"; // the file itself (note: there's no encoding of any kind) $data .= $file['content'] . "\r\n";}// last delimiter$data .= "--" . $delimiter . "--\r\n";$handle = curl_init($url);curl_setopt($handle, CURLOPT_POST, true);curl_setopt($handle, CURLOPT_HTTPHEADER , array( 'Content-Type: multipart/form-data; boundary=' . $delimiter, 'Content-Length: ' . strlen($data))); curl_setopt($handle, CURLOPT_POSTFIELDS, $data);curl_exec($handle);
This way, we're doing all the heavy lifting ourselves, and trusting cURL not to mangle it.
php has access to a temporary location "php://memory", which actually makes what you're trying to do fairly easy.
$fh = fopen('php://memory','rw');fwrite( $fh, $content);rewind($fh);$options = array( CURLOPT_RETURNTRANSFER => true ,CURLOPT_SSL_VERIFYPEER => false ,CURLOPT_SSL_VERIFYHOST => 1 ,CURLOPT_HTTPHEADER => array( 'Content-type: multipart/form-data' ) ,CURLOPT_INFILE => $fh ,CURLOPT_INFILESIZE => strlen($content));