Can anyone give me an example for PHP's CURLFile class?

55,897

Solution 1

There is a snippet on the RFC for the code: https://wiki.php.net/rfc/curl-file-upload

curl_setopt($curl_handle, CURLOPT_POST, 1);
$args['file'] = new CurlFile('filename.png', 'image/png', 'filename.png');
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $args);

You can also use the seemingly pointless function curl_file_create( string $filename [, string $mimetype [, string $postname ]] ) if you have a phobia of creating objects.

curl_setopt($curl_handle, CURLOPT_POST, 1);
$args['file'] = curl_file_create('filename.png', 'image/png', 'filename.png');
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $args);

Solution 2

Thanks for your help, using your working code I was able to solve my problem with php 5.5 and Facebook SDK. I was getting this error from code in the sdk class.

I don't thinks this count as a response, but I'm sure there are people searching for this error like me related to facebook SDK and php 5.5

In case someone has the same problem, the solution for me was to change a little code from base_facebook.php to use the CurlFile Class instead of the @filename.

Since I'm calling the sdk from several places, I've just modified a few lines of the sdk:

In the method called "makeRequest" I made this change:

In this part of the code:

if ($this->getFileUploadSupport()){
    $opts[CURLOPT_POSTFIELDS] = $params;
} else {
    $opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&');
}

Change the first part (with file upload enabled) to:

if ($this->getFileUploadSupport()){
  if(!empty($params['source'])){
     $nameArr = explode('/', $params['source']);
     $name    = $nameArr[count($nameArr)-1]; 
     $source  = str_replace('@', '', $params['source']);
     $size    = getimagesize($source); 
     $mime    = $size['mime'];
     $params['source'] = new CurlFile($source,$mime,$name);
  }

  if(!empty($params['image'])){
     $nameArr = explode('/', $params['image']);
     $name    = $nameArr[count($nameArr)-1]; 
     $image   = str_replace('@', '', $params['image']);
     $size    = getimagesize($image); 
     $mime    = $size['mime'];
     $params['image'] = new CurlFile($image,$mime,$name);
  }
  $opts[CURLOPT_POSTFIELDS] = $params;
} else {
    $opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&');
}

Maybe this can be improved parsing every $param and looking for '@' in the value.. but I did it just for source and image because was what I needed.

Solution 3

FOR curl_setopt(): The usage of the @filename API for file uploading is deprecated. Please usethe CURLFile class instead

$img='image.jpg';

$data_array = array(
        'board' => $board_id,
        'note' => $note,
        'image' => new CurlFile($img)
    );

$curinit = curl_init($url);
     curl_setopt($curinit, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($curinit, CURLOPT_POST, true);
     curl_setopt($curinit, CURLOPT_CUSTOMREQUEST, "POST");
     curl_setopt($curinit, CURLOPT_POSTFIELDS, $data_array);
     curl_setopt($curinit, CURLOPT_SAFE_UPLOAD, false);
     $json = curl_exec($curinit);
     $phpObj = json_decode($json, TRUE);  
     return $phpObj;
Share:
55,897
luci5r
Author by

luci5r

Updated on July 09, 2022

Comments

  • luci5r
    luci5r almost 2 years

    I had a very simple PHP code to upload a file to a remote server; the way I was doing it (as has been suggested here in some other solutions) is to use cUrl to upload the file.

    Here's my code:

    $ch = curl_init("http://www.remotesite.com/upload.php"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, array('fileupload' => '@'.$_FILES['Filedata']['tmp_name'])); 
    echo curl_exec($ch);        
    

    The server is running PHP 5.5.0 and it appears that @filename has been deprecated in PHP >= 5.5.0 as stated here under the CURLOPT_POSTFIELDS description, and therefore, I'm getting this error:

    Deprecated: curl_setopt(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead in ... 
    

    Interestingly, there is absolutely nothing about this Class on php.net aside from a basic class overview. No examples, no description of methods or properties. It's basically blank here. I understand that is a brand new class with little to no documentation and very little real-world use which is why practically nothing relevant is coming up in searches on Google or here on Stackoverflow on this class.

    I'm wondering if there's anyone who has used this CURLFile class and can possibly help me or give me an example as to using it in place of @filename in my code.

    Edit:

    I wanted to add my "upload.php" code as well; this code would work with the traditional @filename method but is no longer working with the CURLFile class code:

    $folder = "try/";
    $path = $folder . basename( $_FILES['file']['tmp_name']); 
    if(move_uploaded_file($_FILES['file']['tmp_name'], $path)) {
    echo "The file ".  basename( $_FILES['file']['tmp_name']). " has been uploaded";
    }
    

    Final Edit:

    Wanted to add Final / Working code for others looking for similar working example of the scarcely-documented CURLFile class ...

    curl.php (local server)

    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
    <label for="file">Filename:</label> <input type="file" name="Filedata" id="Filedata" /> 
    <br />
    <input type="submit" name="submit" value="Submit" />
    </form>
    
    <?php
    if ($_POST['submit']) {
        $uploadDir = "/uploads/";
        $RealTitleID = $_FILES['Filedata']['name'];
        $ch = curl_init("http://www.remotesite.com/upload.php"); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $args['file'] = new CurlFile($_FILES['Filedata']['tmp_name'],'file/exgpd',$RealTitleID);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $args); 
        $result = curl_exec($ch);       
    }
    ?>
    

    upload.php (remote server)

    $folder = "try/";
    $path = $folder . $_FILES['file']['name']; 
    if(move_uploaded_file($_FILES['file']['tmp_name'], $path)) {
    echo "The file ".  basename( $_FILES['file']['name']). " has been uploaded";
    } 
    
  • Danack
    Danack almost 11 years
    Well - the bit I pasted is almost all of the useful bit that's not in the docs.
  • luci5r
    luci5r almost 11 years
    The page definitely gives a more useful look at real-world usage of the class; and adding $args['file'] = new CurlFile($_FILES['Filedata']['tmp_name']); curl_setopt($ch, CURLOPT_POSTFIELDS, $args); got rid of the Deprecated error; in fact it got rid of errors all together. The problem I have now is that my "upload.php" on the other end has become invalid. I'm not sure what changes I need to make to it in order to RECIEVE the file - because it's not actually receiving the file anymore.
  • machineaddict
    machineaddict over 7 years
    You could add if (version_compare(PHP_VERSION, '5.5.0') >= 0) to your code else fall back to @
  • TommyAutoMagically
    TommyAutoMagically almost 7 years
    Useful; thanks! FWIW, I think it might make more sense to abandon the @ format entirely and change your application code to use the CurlFile() approach. But that's up for debate. Either way, thanks!
  • orrd
    orrd over 6 years
    When using the CurlFile technique, you shouldn't set CURLOPT_SAFE_UPLOAD (it defaults to true, and it should be left that way), so that line should be removed. CURLOPT_SAFE_UPLOAD is no long even included in PHP 7.
  • Axel López
    Axel López about 5 years
    one question... when i try to catch my file, doesn't appear in $_FILE['file'] variable, is in $_POST['file'], you know why??