POST a file string using cURL in PHP? POST a file string using cURL in PHP? curl curl

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));