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

je dois voir si une image spécifique existe sur mon cdn.

j'ai essayé la suivante 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, il dit toujours "Le fichier existe". Je ne sais pas pourquoi sa ne fonctionne pas...

86
demandé sur Tshepang 2011-11-03 11:24:27

18 réponses

vous avez besoin du nom du fichier entre guillemets au moins (comme chaîne):

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

assurez-vous également que $filename est correctement validé. Et puis, cela ne fonctionnera que lorsque allow_url_fopen sera activé dans votre config PHP

109
répondu knittl 2011-11-03 07:27:54
if (file_exists('http://www.mydomain.com/images/'.$filename)) {}

ça n'a pas marché pour moi. La façon dont je l'ai fait était d'utiliser getimagesize.

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

if (@getimagesize($src)) {

notez que le '@' signifiera que si l'image n'existe pas (auquel cas la fonction lancera habituellement une erreur: getimagesize(http://www.mydomain.com/images/filename.png) [function.getimagesize]: failed ) elle retournera false.

95
répondu Jeffrey Jenkinson 2013-02-28 09:57:28

bien, file_exists ne dit pas si un fichier existe, il dit si un chemin existe . ⚡⚡⚡⚡⚡⚡⚡

donc, pour vérifier s'il s'agit d'un fichier, vous devez utiliser is_file avec file_exists pour savoir s'il y a vraiment un fichier derrière le chemin, sinon file_exists retournera true pour tout chemin existant.

Voici la fonction que j'utilise :

function fileExists($filePath)
{
      return is_file($filePath) && file_exists($filePath);
}
14
répondu Rizerzero 2018-08-14 17:50:57

essayez comme ceci:

$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";
}
13
répondu pinaldesai 2013-02-10 16:12:40

une chose que vous devez d'abord comprendre: vous n'avez pas de fichiers .

Un fichier fait l'objet d'un système de fichiers , mais vous faites votre demande en utilisant le protocole HTTP qui ne supporte pas de fichiers mais des URL.

si, vous devez demander un fichier inexistant en utilisant votre navigateur et de voir le code de réponse. si ce n'est pas 404, vous n'êtes pas en mesure d'utiliser les wrappers pour voir si un fichier existe et vous devez demander votre cdn en utilisant un autre protocole, FTP par exemple

9
répondu Your Common Sense 2011-11-03 07:37:32

Voici la façon la 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
répondu jfindley 2018-02-07 22:14:02

Si le fichier est sur votre domaine, vous n'avez pas besoin de mettre l'URL complète. Seulement le chemin vers le fichier. Si le fichier est dans un autre répertoire, vous devez faire précéder le chemin avec "."

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

souvent fois le"."est laissé de côté qui va provoquer le fichier comme n'existant pas, quand il le fait.

8
répondu master_gracey 2013-10-27 20:51:53
public static function is_file_url_exists($url) {
        if (@file_get_contents($url, 0, NULL, 0, 1)) {
            return 1;
        }

        return 0;           
    }
6
répondu realmag777 2013-03-19 11:47:13

il y a une différence majeure entre is_file et file_exists .

is_file retourne true pour les fichiers (réguliers):

Renvoie VRAI si le nom de fichier existe et est un fichier régulier, FALSE dans le cas contraire.

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

Renvoie VRAI si le fichier ou le répertoire spécifié par filename existe; FALSE dans le cas contraire.


Note: cochez aussi cette question sur le débordement des piles pour plus d'information sur ce sujet.

4
répondu Wilt 2017-05-23 11:54:54

vous devez utiliser absolute path 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 le CMS ou le cadre PHP, alors autant que je sache, tous ont défini constant pour le chemin racine du document.

E. G WordPress utilise 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";

}

mile supplémentaire ici :). Parce que ce code n'aurait pas besoin de beaucoup d'entretien et assez solide, Je l'écrirais avec comme sténographie si la déclaration:

$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';

Raccourci SI l'instruction a expliqué:

$stringVariable = ($trueOrFalseComaprison > 0)?'String if true':'String if false';
3
répondu Dmitriy Kravchuk 2015-08-26 20:48:44

vous pouvez utiliser cURL. Vous pouvez obtenir cURL pour seulement vous donner les headers, et pas le corps, ce qui pourrait le rendre plus rapide. Un mauvais domaine peut toujours prendre un certain temps parce que vous attendrez la requête pour time-out; 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';   
}
3
répondu manish1706 2016-03-29 12:01:22

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.

2
répondu Kai 2011-11-03 07:47:01

essayez ceci:

if (file_exists(FCPATH . 'uploads/pages/' . $image)) {
    unlink(FCPATH . 'uploads/pages/' . $image);
}
2
répondu Dev_meno 2018-05-09 13:47:30

lire les 5 premiers octets du formulaire HTTP en utilisant fopen() et fread() puis utiliser ceci:

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

pour détecter l'image.

1
répondu Peter 2011-11-03 07:57:38

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 ceci:

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

si le répertoire /images/ existe, la fonction retournera toujours 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
}
1
répondu dapidmini 2016-11-03 04:04:21

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

is_file($filepath) ne retourne true pour filepaths

1
répondu PodTech.io 2017-11-28 23:12:21

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

}

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

1
répondu Yogi Ghorecha 2017-12-06 10:21:51

vous avez besoin du chemin du serveur avec file_exists

par exemple

if (file_exists('/httpdocs/images/'.$filename)) {echo 'File exist'; }
1
répondu Altravista 2018-07-18 09:33:31