Check whether image exists on remote URL
PhpUrlImageCurlPhp Problem Overview
I am generating dynamic URLs of images for book ISBNs. I need a reliable way with PHP to check whether the images actually exist at the remote url. I tried various approaches with different PHP libraries, curl, etc., but none of them works well, some of them are downright slow. Given the fact that I need to generate (and check!) about 60 URLS for each book in my database, this is a huge waiting time. Any clues?
Php Solutions
Solution 1 - Php
function checkRemoteFile($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
// don't download content
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
if($result !== FALSE)
{
return true;
}
else
{
return false;
}
}
--> that is the fastest way if your host supports curl
Solution 2 - Php
Use getimagesize() method like this
$external_link = ‘http://www.example.com/example.jpg’;
if (@getimagesize($external_link)) {
echo “image exists “;
} else {
echo “image does not exist “;
}
Solution 3 - Php
There is no "easy" way here - at a very minimum, you need to generate a HEAD
request and check the resulting content type to make sure it's an image. That's not taking into account possible referrer issues. curl is the way to go here.
Solution 4 - Php
I have been doing this for my real estate picture tracking...
$im = @imagecreatefromjpeg($pathtoimg);
if($im)
imagedestroy($im); // dont save, just ack...
elseif(!$missing[$inum])
$img404arr[] = $inum;
It 'seems' faster than downloading the actual image, taking about .3 seconds for each from images that avg 100k.
I wish I could just do a header check and read whether I get a 200 vs a 404 without downloading anything. Anyone have that handy?
Solution 5 - Php
You could use curl. Just set the curl option CURLOPT_NOBODY to true. This will skip body information and only get the head (thus http code as well). Then, you could use the CURLOPT_FAILONERROR to turn this whole process into a true/false type check
Solution 6 - Php
You can use getimagesize()
Credit: http://junal.wordpress.com/2008/07/22/checking-if-an-image-url-exist/
Solution 7 - Php
if(@getimagesize($remoteImageURL)){
//image exists!
}else{
//image does not exist.
}
Solution 8 - Php
It's probably moot at this point, but this works for me:
function is_webfile($webfile)
{
$fp = @fopen($webfile, "r");
if ($fp !== false)
fclose($fp);
return($fp);
}
Solution 9 - Php
Solution from https://www.experts-exchange.com
<?php
function url_exists($url) {
if (!$fp = curl_init($url)) return false;
return true;
}
?>
Solution 10 - Php
If the images all exist on the same remote server (or in the same network), you could run a web service on that server that will check the file system for the the image file and return a bool value indicating wheter the image exists or not.