dipi evil
dipi evil

Reputation: 517

Get remote image with PHP and show it with GD

I have a code in my website to show remote Gravatar portraits or uploaded images. Uploaded is ok, but i can't get the gravatar images.

Cant use file_get_contents because it´s not allowed on my host.

Heres the start check for the file

if(file_exists($arUser['imagem'][0])){
    $imgPath = $arUser['imagem'][0]; //Usar a imagem enviada
}elseif(!strlen($arUser['imagem'][0]) && checkRemoteFile('http://www.gravatar.com/avatar/'.md5($arUser['email'][0]).'fs=150')){
    $imgPath = 'http://www.gravatar.com/avatar/'.md5($arUser['email'][0]).'fs=150';
}else           
    $imgPath = '../img/social_noavatar_150.jpg'; //Temporario

So this doesn´t work:

$imgData = getimagesize($imgPath);
$src = imagecreatefromwhatever($imgPath);   

I know I should replace:

$imgPath = 'http://www.gravatar.com/avatar/'.md5($arUser['email'][0]).'fs=150';

with something like:

$imgPath = GetFileData('http://www.gravatar.com/avatar/'.md5($arUser['email'][0]).'fs=150');

or

*$imgPath = file_get_contents('http://www.gravatar.com/avatar/'.md5($arUser['email'][0]).'fs=150');*

Got error with both and I can´t create the image:

I´ve searched for the answer but the others didn't fited to me.

Sorry for my bad english. :(

Note:

function imagecreatefromwhatever($image){
$info = pathinfo($image);
$extension = strtolower($info['extension']);
switch($extension) {
    case "jpg":
        return imagecreatefromjpeg($image);
    break;
    case "jpeg":
        return imagecreatefromjpeg($image);
    break;
    case "png":
        return imagecreatefrompng($image);
    break;
    case "gif":
        return imagecreatefromgif($image);
    break;
    default:
        return imagecreatefromjpeg($image);
}
}

Upvotes: 0

Views: 1308

Answers (4)

dipi evil
dipi evil

Reputation: 517

The easiest way I have found is to transfer the location:

 if(checkRemoteFile('http://www.gravatar.com/avatar/'.md5($arUser['email'][0])))
    header('Location: http://www.gravatar.com/avatar/'.md5($arUser['email'][0]).'fs='.$sizePic);

Upvotes: 1

Yahel
Yahel

Reputation: 8550

Well, if file_get_content is not available on your host, you might be out of luck. If this is a security feature on your host then you won't find a single function that allows you to get data from another server.

You might want to simply bypass the function and set your image src url to the gravatar one. Something like :

<img src="http://www.gravatar.com/avatar/<?=md5($arUser['email'][0]);?>&fs=150" width="150"/>

(Please double check the url, I added a & before the fs as it makes more sense, but I don't know how gravatar api url looks like)

This way it is the client browser that will make the request and not your server.

Upvotes: 1

CLo
CLo

Reputation: 3730

If your host doesn't allow file_get_contents it's likely other methods will not work. From my experience the hosts will prevent any external socket connections from script. So check with the host first.

Assuming that is the issue, you could still echo out an tag with the src attribute to the same location you're trying to get in script.

<img src="<?php echo('http://www.gravatar.com/avatar/'.md5($arUser['email'][0]).'fs=150');?>" />

You could also use the same trick to put the url into a style if you don't want to use the tag.

Upvotes: 0

jeffkee
jeffkee

Reputation: 5238

If your PHP security on your server prevents remote grabbing of files via file_get_contents(), then your next best option is a CURL call to get the file contents fed in perhaps.

Upvotes: 0

Related Questions