441

I need to save an image from a PHP URL to my PC. Let's say I have a page, http://example.com/image.php, holding a single "flower" image, nothing else. How can I save this image from the URL with a new name (using PHP)?

1
  • 1
    If copying a large quantity or size of files, note that CURL methods are preferable (like the 2nd example in the accepted answer) as CURL takes about a third of the time as file_put_contents etc. Commented May 12, 2019 at 11:34

11 Answers 11

783

If you have allow_url_fopen set to true:

$url = 'http://example.com/image.php';
$img = '/my/folder/flower.gif';
file_put_contents($img, file_get_contents($url));

Else use cURL:

$ch = curl_init('http://example.com/image.php');
$fp = fopen('/my/folder/flower.gif', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);
Sign up to request clarification or add additional context in comments.

16 Comments

Thanks bro, your code help me to solve the problem. But could u pls help me to make the script automated .I mean when a new gif image come to the url (“example.com/image.php”) then our script automatically fetch the new image and store it to my directory?
And how do you know, that the new image "came"?
I think riad means using a $_GET variable containing the URL of the image http://example.com/fetch-image.php?url=http://blabla.com/flower.jpg. In the case of this example, you could just call $_GET['url'] in your PHP script, like so: $ch = curl_init($_GET['url']);.
+1 for being the only answer I've seen that includes the "b" for binary flag.
@vartec: coz it was smoking a cigarette and had a big smile on its face :)
|
282

Use PHP's function copy():

copy('http://example.com/image.php', 'local/folder/flower.jpg');

Note: this requires allow_url_fopen

6 Comments

No connection could be made because the target machine actively refused it. :(
@jackkorbin is it an IP restriction or something? What happens when you try it in your browser?
if target folder doesn't exist, will it automatically created?
@Monnster, no, it won't for normal filesystems.
Scenario: Loading a dynamically generated image from remote server to own server (which serves it to the user). If remote server does not supply the resource, it probably yields a 500 (Internal Server Error) on your server.
|
83
$content = file_get_contents('http://example.com/image.php');
file_put_contents('/my/folder/flower.jpg', $content);

8 Comments

The page is holding an animated gif image. A file is stored into the folder as flower.gif .But it is blank.No image show.any solution?
Turn on error_reporting(E_ALL|E_STRICT) and check the return value of file_get_contents(), then you should get a reasonable error message.
Perhaps the site admin has forbidden outside referrals. In that case you can try stream_context_create() and set the appropriate HTTP headers. us2.php.net/manual/en/function.stream-context-create.php
urlencode('example.com/image.php') == 'http%3A%2F%2Fexample.com%2Fimage.php', obviously not what you want. Also file is binary, proper flag needs to be set.
Bit of an old thread... but don't forget file permissions for the directory you are saving into. Just wasted ten minutes forgetting the obvious.
|
33

Vartec's answer with cURL didn't work for me. It did, with a slight improvement due to my specific problem.

e.g.,

When there is a redirect on the server (like when you are trying to save the facebook profile image) you will need following option set:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

The full solution becomes:

$ch = curl_init('http://example.com/image.php');
$fp = fopen('/my/folder/flower.gif', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
curl_close($ch);
fclose($fp);

3 Comments

thanks zuul, really & stoe really found helpful after more search or spend time
brilliant - that has helped so much! Should be noted on the Vartecs answer too
I look forward to trying this code out! Looks like it might be the answer to CORS measures I've been running into since 2020.
30

Here you go, the example saves the remote image to image.jpg.

function save_image($inPath,$outPath)
{ //Download images from remote server
    $in=    fopen($inPath, "rb");
    $out=   fopen($outPath, "wb");
    while ($chunk = fread($in,8192))
    {
        fwrite($out, $chunk, 8192);
    }
    fclose($in);
    fclose($out);
}

save_image('http://www.someimagesite.com/img.jpg','image.jpg');

5 Comments

The guys url is example.com/image.php. Notice that it is a php generated image an not a simple jpeg.
How is the generation of the image or the files extension at all relevant to the question?
fopen needs allow_url_fopen=1 too
@SamThompson from the PHP documentation it means chunk size (usually 8192).
AFAIK fread may return shorter chunk than requested 8K. Don't you need to calculate effective chunk length for fwrite?
10

I wasn't able to get any of the other solutions to work, but I was able to use wget:

$tempDir = '/download/file/here';
$finalDir = '/keep/file/here';
$imageUrl = 'http://www.example.com/image.jpg';

exec("cd $tempDir && wget --quiet $imageUrl");

if (!file_exists("$tempDir/image.jpg")) {
    throw new Exception('Failed while trying to download image');
}

if (rename("$tempDir/image.jpg", "$finalDir/new-image-name.jpg") === false) {
    throw new Exception('Failed while trying to move image file from temp dir to final dir');
}

2 Comments

this solution was also the only one that worked for me. Thank you Andrew!
Watch out if a user can influence $imageUrl, they could execute any command as the user that PHP is running under
4
$img_file='http://www.somedomain.com/someimage.jpg'

$img_file=file_get_contents($img_file);

$file_loc=$_SERVER['DOCUMENT_ROOT'].'/some_dir/test.jpg';

$file_handler=fopen($file_loc,'w');

if(fwrite($file_handler,$img_file)==false){
    echo 'error';
}

fclose($file_handler);

Comments

4

See file()PHP Manual:

$url    = 'http://mixednews.ru/wp-content/uploads/2011/10/0ed9320413f3ba172471860e77b15587.jpg';
$img    = 'miki.png';
$file   = file($url);
$result = file_put_contents($img, $file)

1 Comment

need allow_url_fopen = On
4
$data = file_get_contents('http://example.com/image.php');
$img = imagecreatefromstring($data);
imagepng($img, 'test.png');

Comments

4

None of the answers here mention the fact that a URL image can be compressed (gzip), and none of them work in this case.

There are two solutions that can get you around this:

The first is to use the cURL method and set the curl_setopt CURLOPT_ENCODING, '':

// ... image validation ...

// Handle compression & redirection automatically
$ch = curl_init($image_url);
$fp = fopen($dest_path, 'wb');

curl_setopt($ch, CURLOPT_FILE, $fp);
// Exclude header data
curl_setopt($ch, CURLOPT_HEADER, 0);
// Follow redirected location
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// Auto detect decoding of the response | identity, deflate, & gzip
curl_setopt($ch, CURLOPT_ENCODING, '');

curl_exec($ch);

curl_close($ch);
fclose($fp);

It works, but from hundreds of tests of different images (png, jpg, ico, gif, svg), it is not the most reliable way.

What worked out best is to detect whether an image url has content encoding (e.g. gzip):

// ... image validation ...

// Fetch all headers from URL
$data = get_headers($image_url, true);

// Check if content encoding is set
$content_encoding = isset($data['Content-Encoding']) ? $data['Content-Encoding'] : null;

// Set gzip decode flag
$gzip_decode = ($content_encoding == 'gzip') ? true : false;

if ($gzip_decode)
{
    // Get contents and use gzdecode to "unzip" data
    file_put_contents($dest_path, gzdecode(file_get_contents($image_url)));
}
else
{
    // Use copy method
    copy($image_url, $dest_path);
}

For more information regarding gzdecode see this thread. So far this works fine. If there's anything that can be done better, let us know in the comments below.

Comments

1

Create a folder named images located in the path you are planning to place the php script you are about to create. Make sure it has write rights for everybody or the scripts won't work ( it won't be able to upload the files into the directory).

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.