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);

14
demandé sur ina 2010-09-09 19:19:27

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
11
répondu Alex 2010-09-09 16:17:48

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)

7
répondu David A. D. Konrad 2011-05-26 03:35:57

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'">
2
répondu Pekka 웃 2010-09-09 16:40:52
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.

1
répondu Nik 2016-01-20 03:18:53

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

1
répondu Hassan Saeed 2017-01-23 17:28:02

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.

0
répondu Alex Ciminian 2010-09-09 15:45:31

avez-vous essayé la méthode file_get_contents ()?

http://php.net/manual/en/function.file-get-contents.php

0
répondu pMan 2010-09-09 16:38:25