web-dev-qa-db-fra.com

PHP: Comment vérifier si un fichier image existe?

J'ai besoin de voir si une image spécifique existe sur mon cdn.

J'ai essayé ce qui suit et ça ne marche pas:

if (file_exists(http://www.example.com/images/$filename)) {
    echo "The file exists";
} else {
    echo "The file does not exist";
}

Même si l'image existe ou n'existe pas, elle dit toujours "Le fichier existe". Je ne sais pas pourquoi ça ne marche pas ...

87
PaperChase

Vous avez besoin du nom de fichier entre guillemets au moins (sous forme de chaîne):

if (file_exists('http://www.mydomain.com/images/'.$filename)) {
 … }

Assurez-vous également que $filename est correctement validé. Et ensuite, cela ne fonctionnera que si allow_url_fopen est activé dans votre configuration PHP

111
knittl
if (file_exists('http://www.mydomain.com/images/'.$filename)) {}

Cela n'a pas fonctionné pour moi. La façon dont je l'ai fait utilisait getimagesize.

$src = 'http://www.mydomain.com/images/'.$filename;

if (@getimagesize($src)) {

Notez que le '@' signifiera que si l'image n'existe pas (dans ce cas, la fonction générera généralement une erreur: getimagesize(http://www.mydomain.com/images/filename.png) [function.getimagesize]: failed), elle retournera false.

96
Jeffrey Jenkinson

Eh bien,file_existsne dit pas si un fichier existe, il dit si un chemin existe . ⚡⚡⚡⚡⚡⚡⚡

Donc, pour vérifier si c'est un fichier, vous devez utiliseris_fileavecfile_existspour savoir s'il y a vraiment un fichier derrière le chemin, sinonfile_existsretourneratruepour tout chemin existant.

Voici la fonction que j'utilise:

function fileExists($filePath)
{
      return is_file($filePath) && file_exists($filePath);
}
13
Rizerzero

Essayez comme ça:

$file = '/path/to/foo.txt'; // 'images/'.$file (physical path)

if (file_exists($file)) {
    echo "The file $file exists";
} else {
    echo "The file $file does not exist";
}
12
pinaldesai

Voici le moyen le plus simple de vérifier si un fichier existe:

if(is_file($filename)){
    return true; //the file exist
}else{
    return false; //the file does not exist
}
9
jfindley

Une chose que vous devez comprendre d’abord: vous n’avez pas de fichiers .
Un fichier est sujet d'un système de fichiers, mais vous faites votre demande en utilisant le protocole HTTP qui ne prend en charge que les fichiers, à l'exception des URL.

Vous devez donc demander un fichier non existant à l'aide de votre navigateur et voir le code de réponse. si ce n'est pas 404, vous ne pouvez utiliser aucun wrapper pour voir si un fichier existe et vous devez demander votre cdn en utilisant un autre protocole, FTP par exemple

8

Si le fichier se trouve sur votre domaine local, vous n'avez pas besoin de mettre l'URL complète. Seul le chemin d'accès au fichier. Si le fichier se trouve dans un répertoire différent, vous devez alors préfacer le chemin avec "."

$file = './images/image.jpg';
if (file_exists($file)) {}

Souvent, le "." est laissé, ce qui fera apparaître le fichier comme non existant, alors qu’il le fait.

7
master_gracey
public static function is_file_url_exists($url) {
        if (@file_get_contents($url, 0, NULL, 0, 1)) {
            return 1;
        }

        return 0;           
    }
6
realmag777

Il existe une différence majeure entre is_file et file_exists.

is_file renvoie vrai pour les fichiers (normaux):

Renvoie TRUE si le nom du fichier existe et est un fichier normal, FALSE sinon.

file_exists renvoie true pour les fichiers et les répertoires:

Renvoie TRUE si le fichier ou le répertoire spécifié par nom_fichier existe; FALSE sinon.


Remarque: _ ​​Vérifiez également cette question de stackoverflow pour plus d'informations sur ce sujet.

3
Wilt

vous pouvez utiliser cURL. Vous pouvez obtenir que cURL ne vous donne que les en-têtes, et non le corps, ce qui pourrait le rendre plus rapide. Un mauvais domaine peut toujours prendre un certain temps car vous attendez que la requête expire; vous pouvez probablement changer la durée de timeout en utilisant cURL.

Voici un exemple: 

function remoteFileExists($url) {
$curl = curl_init($url);

//don't fetch the actual page, you only want to check the connection is ok
curl_setopt($curl, CURLOPT_NOBODY, true);

//do request
$result = curl_exec($curl);

$ret = false;

//if request did not fail
if ($result !== false) {
    //if request was ok, check response code
    $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);  

    if ($statusCode == 200) {
        $ret = true;   
    }
}

curl_close($curl);

return $ret;
}
$exists = remoteFileExists('http://stackoverflow.com/favicon.ico');
if ($exists) {
echo 'file exists';
} else {
   echo 'file does not exist';   
}
2
manish1706

Vous devez utiliser un chemin absolu pour voir si le fichier existe.

$abs_path = '/var/www/example.com/public_html/images/';
$file_url = 'http://www.example.com/images/' . $filename;

if (file_exists($abs_path . $filename)) {

    echo "The file exists. URL:" . $file_url;

} else {

    echo "The file does not exist";

}

Si vous écrivez pour un CMS ou un framework PHP, pour autant que je sache, tous ont défini une constante pour le chemin racine du document. 

wordPress utilise par exemple ABSPATH qui peut être utilisé globalement pour travailler avec des fichiers sur le serveur en utilisant votre code ainsi que l’URL du site.

Exemple Wordpress:

$image_path = ABSPATH . '/images/' . $filename;
$file_url = get_site_url() . '/images/' . $filename;

if (file_exists($image_path)) {

    echo "The file exists. URL:" . $file_url;

} else {

    echo "The file does not exist";

}

Je vais un kilomètre supplémentaire ici :). Parce que ce code n'aurait pas besoin de beaucoup de maintenance et d'assez solide, je l'écrirais avec un raccourci si:

$image_path = ABSPATH . '/images/' . $filename;
$file_url = get_site_url() . '/images/' . $filename;

echo (file_exists($image_path))?'The file exists. URL:' . $file_url:'The file does not exist';

Déclaration IF abrégée expliquée:

$stringVariable = ($trueOrFalseComaprison > 0)?'String if true':'String if false';
2
Dmitriy Kravchuk

Vous pouvez utiliser la fonction file_get_contents pour accéder aux fichiers distants. Voir http://php.net/manual/en/function.file-get-contents.php pour plus de détails.

1
Kai

essaye ça : 

if (file_exists(FCPATH . 'uploads/pages/' . $image)) {
    unlink(FCPATH . 'uploads/pages/' . $image);
}
1
Dev_meno

Si vous utilisez curl, vous pouvez essayer le script suivant:

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

}

Référence URL: https://hungred.com/how-to/php-check-remote-email-url-image-link-exist/

0
Yogi Ghorecha

vous avez besoin du chemin du serveur avec file_exists

par exemple

if (file_exists('/httpdocs/images/'.$filename)) {echo 'File exist'; }
0
Altravista

Lisez les 5 premiers octets de HTTP en utilisant fopen() et fread(), puis utilisez ceci:

DEFINE("GIF_START","GIF");
DEFINE("PNG_START",pack("C",0x89)."PNG");
DEFINE("JPG_START",pack("CCCCCC",0xFF,0xD8,0xFF,0xE0,0x00,0x10)); 

détecter une image. 

0
Peter

file_exists($filepath) retournera un résultat vrai pour un répertoire et un chemin de fichier complet, donc ce n'est pas toujours une solution lorsqu'un nom de fichier n'est pas passé.

is_file($filepath) ne retournera vrai que pour les chemins de fichiers complets

0
PodTech.io

file_exists lit non seulement les fichiers, mais aussi les chemins. Ainsi, lorsque $filename est vide, la commande s'exécute comme si elle était écrite comme suit:

file_exists("http://www.example.com/images/")

si le répertoire/images/existe, la fonction retournera quand même true.

Je l'écris habituellement comme ceci:

// !empty($filename) is to prevent an error when the variable is not defined
if (!empty($filename) && file_exists("http://www.example.com/images/$filename"))
{
    // do something
}
else
{
    // do other things
}
0
dapidmini

Si le chemin d'accès à votre image est relatif à la racine de l'application, il est préférable d'utiliser quelque chose comme ceci:

function imgExists($path) {
    $serverPath = $_SERVER['DOCUMENT_ROOT'] . $path;

    return is_file($serverPath)
        && file_exists($serverPath);
}

Exemple d'utilisation de cette fonction:

$path = '/tmp/teacher_photos/1546595125-IMG_14112018_160116_0.png';

$exists = imgExists($path);

if ($exists) {
    var_dump('Image exists. Do something...');
}

Je pense que c'est une bonne idée de créer quelque chose comme une bibliothèque pour vérifier l'existence d'une image applicable dans différentes situations. Vous pouvez utiliser beaucoup de bonnes réponses pour résoudre cette tâche.

0
B. Bohdan