PHP détecte si le lien d'url de l'Image source mène à une image" cassée"?
supposons que vous ayez un script de générateur de vignettes qui accepte les images source sous forme D'URL. Y a - t-il un moyen de détecter si l'URL source est "cassée" - si elle n'existe pas ou si elle mène à un fichier non image?
Juste à la force brute à l'aide de getimagesize()
ou un autre PHP GD fonction n'est pas une solution, car usurpée errants URL qui peut ne pas être d'images (http://example.com/malicious.exe
ou le même fichier, mais rebaptisé http://example.com/malicious.jpg
) pourraient être entrées - de tels cas pourraient facilement être détectés par PHP avant d'avoir à invoquer GD. Je cherche GD pré-aseptisant avant que GD essaye son bataillon à analyser le fichier.
dans un premier temps, l'expression régulière suivante vérifie si L'URL est une extension d'image:
preg_match('@(https?://([-w.]+)+(:d+)?(/([w/_.]*(?S+)?)?)?)([^s]+(.(?i)(jpg|png|gif|bmp))$)@', $txt,$url);
7 réponses
utiliser file_exists
fonction en php, vous pouvez vérifier les url avec elle.
Voir la documentation ci-dessous, montre comment vérifier img... exactement ce dont vous avez besoin
LE FICHIER EXISTE - http://www.php.net/manual/en/function.file-exists.php#93572
URL EXISTE - http://www.php.net/manual/en/function.file-exists.php#85246
Ici code alternatif pour vérifier l'url. Si vous permettra de tester en navigateur remplacer \n
<br/>
<?php
$urls = array('http://www.google.com/images/logos/ps_logo2.png', 'http://www.google.com/images/logos/ps_logo2_not_exists.png');
foreach($urls as $url){
echo "$url - ";
echo url_exists($url) ? "Exists" : 'Not Exists';
echo "\n\n";
}
function url_exists($url) {
$hdrs = @get_headers($url);
echo @$hdrs[1]."\n";
return is_array($hdrs) ? preg_match('/^HTTP\/\d+\.\d+\s+2\d\d\s+.*$/',$hdrs[0]) : false;
}
?>
la Sortie est comme suit
http://www.google.com/images/logos/ps_logo2.png - Content-Type: image/png
Exists
http://www.google.com/images/logos/ps_logo2_not_exists.png - Content-Type: text/html; charset=UTF-8
Not Exists
j'ai utilisé ce qui suit pour détecter des attributs pour des images distantes
$src='http://example.com/image.jpg';
list($width, $height, $type, $attr) = @getimagesize($src);
exemple (vérification de la stackoverflows "Carrières 2.0" de l'image)
$src='http://sstatic.net/ads/img/careers2-ad-header-so.png';
list($width, $height, $type, $attr) = @getimagesize($src);
echo '<pre>';
echo $width.'<br>';
echo $height.'<br>';
echo $type.'<br>';
echo $attr.'<br>';
echo '</pre>';
si $height, $width etc est null l'image est évidente pas une image ou le fichier n'existe pas. L'utilisation de cURL est excessive et plus lente (même avec CURLOPT_HEADER)
la seule façon vraiment fiable est de demander l'image en utilisant file_get_contents()
, et trouver son type d'image en utilisant getimagesize()
.
Seulement si getimagesize()
retourne un type de fichier valide, pouvez vous fier qu'il est en fait une image valide.
Ceci est assez lourd de ressources, cependant.
vous pourriez envisager de ne pas faire de vérifications côté serveur du tout, et d'ajouter un onerror
Evénement JavaScript vers la ressource d'image finale:
<img src="..." onerror="this.style.display = 'none'">
try for local files
<?php
if(file_exists($filename))
{
//do what you want
}
else
{
//give error that file does not exists
}
?>
pour les domaines externes
$headers = @get_headers($url);
if (preg_match("|200|", $headers[0])) {
// file exists
} else {
// file doesn't exist
}
vous pouvez aussi utiliser curl request pour le même.
solution rapide pour le lien d'images brisées ou non trouvées
je vous suggère de ne pas utiliser getimagesize () car il va télécharger la première image puis il vérifiera la taille des images+si ce ne sera pas l'image alors il lancera l'exception alors utilisez le code ci-dessous
if(checkRemoteFile($imgurl))
{
//found url, its mean
echo "this is image";
}
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);
if(curl_exec($ch)!==FALSE)
{
return true;
}
else
{
return false;
}
}
Remarque: ce code courant vous aide à identifier l'image url brisée ou non trouvée cela ne vous aidera pas à identifier le type d'image ou les en-têtes
Vous pouvez cocher la case Code D'état HTTP (il doit être de 200) et le en-tête Content-type (image / png etc.) de la réponse HTTP avant de mettre l'image réelle à travers le générateur.
si ces deux conditions préalables sont ok, après avoir récupéré l'image vous pouvez appeler getimagesize()
sur elle et voir si elle se casse, quel type MIME il retourne etc.