how to upload file using curl with PHP

217,210

Use:

if (function_exists('curl_file_create')) { // php 5.5+
  $cFile = curl_file_create($file_name_with_full_path);
} else { // 
  $cFile = '@' . realpath($file_name_with_full_path);
}
$post = array('extra_info' => '123456','file_contents'=> $cFile);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$target_url);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$result=curl_exec ($ch);
curl_close ($ch);

You can also refer:

http://blog.derakkilgo.com/2009/06/07/send-a-file-via-post-with-curl-and-php/

Important hint for PHP 5.5+:

Now we should use https://wiki.php.net/rfc/curl-file-upload but if you still want to use this deprecated approach then you need to set curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);

Share:
217,210
Hadidi44
Author by

Hadidi44

a Hacker

Updated on July 08, 2022

Comments

  • Hadidi44
    Hadidi44 almost 2 years

    I want to know how to upload file using cURL or anything else in PHP. I have searched in google many times but no results.

    In other words, the user sees a file upload button on a form, the form gets posted to my php script, then my php script needs to re-post it to another script (eg on another server).

    I have this code to receive the file and upload it

    code :

    echo"".$_FILES['userfile']."";
    $uploaddir = './';
    $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
    if ( isset($_FILES["userfile"]) ) {
        echo '<p><font color="#00FF00" size="7">Uploaded</font></p>';
        if (move_uploaded_file
    ($_FILES["userfile"]["tmp_name"], $uploadfile))
    echo $uploadfile;
        else echo '<p><font color="#FF0000" size="7">Failed</font></p>';
    }
    

    I want the code to send the file to receiver file.

  • Hadidi44
    Hadidi44 about 11 years
    thanks but how to upload it in different name like the file name is x.php and i want to upload it with z.php name
  • karthik
    karthik about 11 years
    In the about example "sample" is the name. you can access the data using $_FILES['sample'] so you can pass x.php and retrieve using $_FILES['x']
  • m3nda
    m3nda over 10 years
    Maybe, is a better way use the built-in feature from curl: php.net/manual/es/function.curl-file-create.php. Of course, you can use the way of POSTFIELDS and fill the value prepending with @. Anyway, the asnwer is copied from a custom usage of curl from a blog. The correct answer is say that the @ char defines it as a file, not a var. $post will contain @filename.jpg by example.
  • Jeremy Logan
    Jeremy Logan almost 10 years
    @erm3nda That's PHP 5.5+ only.
  • Marek Roj
    Marek Roj over 9 years
    @fiXedd im currently using php 5.6, and using curl_file_create is required (the sollution provided by karthik is not working). So the code should be upgraded to something like this: if function_exists('curl_file_create')) { $cFile = curl_file_create($dest); } else { $cFile = '@' . realpath($dest); }
  • Alan H
    Alan H over 9 years
    Now we should use wiki.php.net/rfc/curl-file-upload but if you still want to use this deprecated approach then you need to set curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
  • Aaron Gillion
    Aaron Gillion about 9 years
    What is extra_info => 123456 used for?
  • Michał Fraś
    Michał Fraś about 8 years
    this solution stopped working in php 5.6, the solution is in adding file as: new CURLFile(realpath($fileName));
  • serghei
    serghei about 8 years
    @MarekRoj You make my day
  • gouchaoer
    gouchaoer over 7 years
    CURLOPT_SAFE_UPLOAD is not supported for php7
  • hanshenrik
    hanshenrik over 5 years
    but if you still want to use this deprecated approach then you need to set curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); - this won't work as of PHP 7.0
  • Pooja Jadav
    Pooja Jadav almost 5 years
    This code though, I can't get file content
  • Benyamin Limanto
    Benyamin Limanto almost 5 years
    The RFC should be the answer for it. Thanks for providing clue here.