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

98

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

J'ai essayé ce qui suit et cela ne fonctionne 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 cela ne fonctionne pas ...

PaperChase
la source
1
Vous devez utiliser le chemin complet du fichier dans le système de fichiers de votre serveur (par exemple '/home/you/public/img/sample.gif').
user9440008
Soyez prudent avec cela, car vous pourriez trouver que faire un file_existsvers un emplacement distant sera très lent.
crmpicco

Réponses:

130

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

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

Assurez $filename- vous également qu'il est correctement validé. Et puis, cela ne fonctionnera que lorsqu'il allow_url_fopenest activé dans votre configuration PHP

tricot
la source
5
J'ai pu le faire avec succès en utilisant @GetImageSize. Cependant, qu'est-ce qui sera moins gourmand en serveurs?
PaperChase
9
file_exists () doit utiliser un chemin de fichier sur le disque dur, pas une URL. Cette réponse n'est pas utile pour moi, ne doit pas être définie comme acceptée.
Martin le
Depuis PHP: bool file_exists (string $ filename) Depuis PHP 5.0.0, cette fonction peut également être utilisée avec certains wrappers d'URL. Reportez-vous à Protocoles et wrappers pris en charge pour déterminer quels wrappers prennent en charge la famille de fonctionnalités stat ().
Adrian P.
si la chaîne $ filename est nulle, alors file_exists renverra true pour le répertoire. Mieux vaut utiliser is_file ($ filepath)
PodTech.io
1
Comme les gens l'ont dit, cela ne fonctionne pas sur les URL / chemins distants. Mais cela fonctionne dans les chemins locaux (chemin du serveur interne où se trouvent les fichiers). De plus, à partir d'autres méthodes, la télécommande prend jusqu'à 14 secondes et la durée locale, moins d'une seconde (pour un certain exemple)
Rafa
110
if (file_exists('http://www.mydomain.com/images/'.$filename)) {}

Cela n'a pas fonctionné pour moi. La façon dont je l'ai fait a été 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 getimagesize(http://www.mydomain.com/images/filename.png) [function.getimagesize]: failedrenvoie généralement une erreur:) elle renverra false.

Jeffrey Jenkinson
la source
1
if (@getimagesize ($ src)) {fait des merveilles, merci, merci également pour l'explication de @ here
lesolorzanov

1
getimagesize () fonctionne, mais assurez-vous d'inclure le protocole dans l'URI (par exemple, @getimagesize('//path/to/image.jpg')ne fonctionnera pas).
thdoan

file_exists ou is_file n'a pas fonctionné pour moi, c'est le cas. Merci!
Derk Jan Speelman

@getimagesize ralentira considérablement le chargement de la page. Non recommandé. is_file peut être utilisé à la place et assurez-vous que $ src n'est pas l'url complète: "http: // ..." mais "img / ..."
Bogdan C

is_file et file_exists ne fonctionnent pas pour les images, mais @getimagesize fonctionne correctement.
Alam Zaib

14

Eh bien, file_existsne 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_fileavec file_existspour savoir s'il y a vraiment un fichier derrière le chemin, sinon file_existsil retournera truepour tout chemin existant.

Voici la fonction que j'utilise:

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

2
Comment pourrait-il y avoir un chemin existant, mais le fichier n'existe pas, alors que le chemin contient le nom du fichier?
Andrew

1
je veux dire que cela fonctionne même si l'utilisateur donne un chemin et non un fichier, la fonction retournerait vrai même si ce n'est pas un fichier mon ami.
Rizerzero

Différenciation intéressante et potentiellement importante à faire. Mais si vous consultez la documentation, il semble que vous n'ayez besoin d'utiliser que is_file à cette fin, et non en conjonction avec file_exists.
Andrew

ok laissez-moi vous résumer cela, (use: PaperChase) veut vérifier si un fichier_existe, son problème est que même s'il donne un chemin vers la fonction, il obtiendra une vraie réponse, donc pour vérifier clairement si un fichier existe alors il utiliserait Ma fonction, car la fonction php renverrait true même si un chemin est passé, donc le nom de la fonction est mauvais, il devrait être Path_exists () et Ma fonction vérifie vraiment si un fichier existe, car il renverrait false si un autre chemin qu'un chemin de fichier existant est passé. j'espère que c'est clair maintenant.
Rizerzero

Oui, cela fonctionnerait bien, mais selon php.net/manual/en/function.is-file.php is_file () vérifie déjà si le chemin / fichier existe avant de vérifier s'il s'agit d'un fichier, vous ne devriez donc pas avoir besoin de .
Andrew

13

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

9

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
}

8

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

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


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

        return 0;           
    }

7

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 faire précéder le chemin de "."

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

Souvent, le "." est laissé de côté, ce qui entraînera l'affichage du fichier comme inexistant, alors qu'il le fait en fait.


3

Il existe une différence majeure entre is_fileet file_exists.

is_file renvoie vrai pour les fichiers (normaux):

Renvoie TRUE si le nom de 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 de fichier existe; FAUX sinon.


Remarque: Consultez également cette question stackoverflow pour plus d'informations sur ce sujet.


2

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.

Par exemple, 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";

}

Je fais un effort supplémentaire ici :). Parce que ce code n'aurait pas besoin de beaucoup de maintenance et assez solide, je l'écrirais avec une instruction if:

$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 sténographique IF expliquée:

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

2

vous pouvez utiliser cURL. Vous pouvez demander à cURL de ne vous donner que les en-têtes, et non le corps, ce qui pourrait le rendre plus rapide. Un domaine défectueux peut toujours prendre un certain temps car vous attendez que la demande expire; vous pouvez probablement modifier la durée du délai d'expiration 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';   
}


1

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/

Yogi Ghorecha
1
besoin d'un temps mort ici
Mike Q
il pourrait y avoir une image 404 générique
Votre bon sens
2
Oui - l'image existe donc sur l'URL spécifiée.
Peter
1

essaye ça :

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

Si le chemin de 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 de l'image applicable à différentes situations. Au-dessus de nombreuses réponses intéressantes que vous pouvez utiliser pour résoudre cette tâche.

B. Bohdan
la source
0

Lisez les 5 premiers octets du formulaire HTTP en utilisant fopen(), 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)); 

pour détecter l'image.

Peter
la source
il pourrait y avoir une image 404 générique
Votre bon sens
2
Oui - l'image existe donc sur l'URL spécifiée.
Peter
0

file_existslit non seulement les fichiers, mais aussi les chemins. donc quand $filenameest vide, la commande s'exécuterait 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 généralement 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
}
dapidmini
la source
0

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

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

PodTech.io
la source
0

vous avez besoin du chemin du serveur avec file_exists

par exemple

if (file_exists('/httpdocs/images/'.$filename)) {echo 'File exist'; }
Altravista
la source
0
if(@getimagesize($image_path)){
 ...}

Travaille pour moi.

Sûr Ahmed
la source