MillerMedia
MillerMedia

Reputation: 3671

Sending imagepng() object to server using cURL

I'm trying to take an imagepng() object and upload it to a different server using cURL. Here is the code I've got. To be clear, I know the imagepng file works correctly and is being generated because I can save it locally on the server the code is running on. I'm just not sure how to send that info to a new server. All of the variables are set before this code ($fileName, $imageObject, etc.):

$file = imagepng($imageObject, 'newTest'.$counter.'.png');

if($file){
    $ch = curl_init();
    $fp = $file;
    curl_setopt($ch, CURLOPT_URL, 'ftp://'.$ftp_user.':'.$ftp_pass.'@'.$ftp_server.'/'.$fileName.'.png');
    curl_setopt($ch, CURLOPT_UPLOAD, 1);
    curl_setopt($ch, CURLOPT_INFILE, $fp);
    curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file));
    curl_exec ($ch);
    $error_no = curl_errno($ch);
    curl_close ($ch);
    if ($error_no == 0) {
        $error = 'File uploaded succesfully.';
    } else {
        $error = 'File upload error.';
    }
}

The errors I am getting for every file (this code is in a loop processing multiple files) is. Of course {MY_URL} is replaced with the actual URL of my file:

Warning: curl_setopt(): supplied argument is not a valid File-Handle resource in {MY_URL} on line 43

Warning: filesize() [function.filesize]: stat failed for 1 in {MY_URL} on line 44

So it appears that the file is the wrong format when it's being cURLed. What do I need to set it to in order to send it correctly?

Thanks for your help!

Upvotes: 0

Views: 256

Answers (1)

Ashalynd
Ashalynd

Reputation: 12573

imagepng outputs image into a file,but does not return a file handle (it only returns TRUE in case of success). You need to use something like fopen to get a valid file handle. Try replacing $fp=$file with this:

$fp = fopen('newTest'.$counter.'.png', "rb");

Also, replace filesize($file) with filesize($fp).

In general, $file is just a boolean, not a file handle. Use $fp for every function that expects a file handle. Also, don't forget to close every file at the end of the loop (e.g. add the following line after curl_close):

fclose($fp);

Upvotes: 1

Related Questions