file exists() renvoie false, mais le fichier existe

J'ai un problème très bizarre avec file_exists (). J'utilise cette fonction pour vérifier si 2 fichiers différents dans les mêmes dossiers existent. J'ai vérifié, ils existent tous les deux.

echo $relative . $url['path'] . '/' . $path['filename'] . '.jpg';
Result: ../../images/example/001-001.jpg

echo $relative . $url['path'] . '/' . $path['filename'] . '.' . $path['extension'];
Result: ../../images/example/001-001.PNG

Maintenant, utilisons file_exists() sur ceux-ci:

var_dump(file_exists($relative . $url['path'] . '/' . $path['filename'] . '.jpg'));
Result: bool(false)

var_dump(file_exists($relative . $url['path'] . '/' . $path['filename'] . '.' . $path['extension']));
Result: bool(true)

Je ne comprends pas - ces deux fichiers existent. J'exécute Windows, donc ce n'est pas lié à un problème sensible à la casse. Le mode sans échec est désactivé.

Ce qui pourrait être utile de mentionner que le .png One est téléchargé par un utilisateur via FTP, tandis que le .jpg est créé à l'aide d'un script. Mais pour autant que je sache, cela ne devrait pas faire de différence.

Des conseils?

Merci

26
demandé sur Bv202 2011-08-03 20:52:37

13 réponses

Les résultats du file_exists() sont mis en cache, alors essayez d'utiliser clearstatcache(). Si cela n'a pas aidé, revérifiez les noms - ils pourraient être similaires, mais pas les mêmes.

17
répondu Timur 2011-08-03 17:02:30

J'ai trouvé que ce qui fonctionne pour moi pour vérifier si un fichier existe (par rapport au fichier php actuel à partir duquel il est exécuté) est ce morceau de code:

    $filename = 'myfile.jpg';
    $file_path_and_name = dirname(__FILE__) . DIRECTORY_SEPARATOR . "{$filename}";

        if ( file_exists($file_path_and_name) ){
         // file exists. Do some magic...               
        } else {
             // file does not exists...
        }
12
répondu Shahar 2013-08-01 13:08:58

C'est à cause du mode sans échec. Vous pouvez la désactiver ou inclure le répertoire dans safe_mode_include_dir. Ou changer la propriété des fichiers / autorisations pour ces fichiers.

Php.net: file_exists()
php.net: le mode sans échec

11
répondu ace 2014-03-28 10:31:21

Juste mon $.02: je viens d'avoir ce problème et que c'était dû à un espace à la fin du nom de fichier. Ce n'est pas toujours un problème de chemin - bien que ce soit la première chose que je vérifie - toujours. Je pourrais couper et coller le nom du fichier dans une fenêtre shell en utilisant la commande ls-l et bien sûr qui localise le fichier car la ligne de commande ignorera l'espace où comme file_exists ne le fait pas. Très frustrant en effet et presque impossible à localiser si ce N'était pour StackOverflow.

Indice: lors de la sortie les instructions de débogage contiennent des valeurs avec des délimiteurs () ou [] et cela montrera un espace assez clairement. Et rappelez-vous toujours de couper votre entrée.

9
répondu Brian 2012-12-11 21:22:59

file_exists() ne fonctionne tout simplement pas avec les adresses HTTP.

Il ne supporte que les chemins du système de fichiers (et FTP, si vous utilisez PHP5.)

Veuillez noter:

Travaillé :

if  (file_exists($_SERVER['DOCUMENT_ROOT']."/folder/test.txt") 
    echo "file exists";

Non travaillé:

if (file_exists("www.mysite.com/folder/test.txt") 
    echo "file exists";
9
répondu Mahdi Loghmani 2017-03-10 08:15:01

Essayez d'utiliser DIRECTORY_SEPARATOR au lieu de '/' comme séparateur. Windows utilise un séparateur différent pour les chemins du système de fichiers (barre oblique inverse) que les systèmes Linux et Unix.

2
répondu Doug 2014-04-09 21:07:07

Il peut également s'agir d'un problème d'autorisation sur l'un des dossiers parents ou le fichier lui-même.

Essayez d'ouvrir une session en tant qu'utilisateur exécutant votre serveur web et cd en elle. Le dossier doit être accessible par l'utilisateur et le fichier doit être lisible.

Si ce n'est pas le cas, php retournera que le fichier n'existe pas.

1
répondu Julien Ricard 2015-07-27 19:54:54

Un truc très simple est ici qui a fonctionné pour moi.

Quand j'écris la ligne suivante, qu'il renvoie false.

if(file_exists('/my-dreams-files/'.$_GET['article'].'.html'))

Et quand j'écris avec la suppression de L'URL à partir de la barre oblique, alors il retourne true.

if(file_exists('my-dreams-files/'.$_GET['article'].'.html'))
1
répondu Mangilal Sharma 2016-03-06 14:37:51

Avez-vous essayé la saisie manuelle. en outre, vos deux extensions semblent être dans un cas différent

   var_dump(file_exists('../../images/example/001-001.jpg'));
   var_dump(file_exists('../../images/example/001-001.PNG'));
0
répondu amigura 2011-08-03 17:33:56

Une fonction custom_file_exists() inspirée par @Timur, @ Brian, @ Doug et @Shahar réponses précédentes:

function custom_file_exists($file_path=''){
    $file_exists=false;

    //clear cached results
    //clearstatcache();

    //trim path
    $file_dir=trim(dirname($file_path));

    //normalize path separator
    $file_dir=str_replace('/',DIRECTORY_SEPARATOR,$file_dir).DIRECTORY_SEPARATOR;

    //trim file name
    $file_name=trim(basename($file_path));

    //rebuild path
    $file_path=$file_dir."{$file_name}";

    //If you simply want to check that some file (not directory) exists, 
    //and concerned about performance, try is_file() instead.
    //It seems like is_file() is almost 2x faster when a file exists 
    //and about the same when it doesn't.

    $file_exists=is_file($file_path);

    //$file_exists=file_exists($file_path);

    return $file_exists;
}
0
répondu RafaSashi 2015-01-16 11:40:15

Cette réponse peut être un peu hacky, mais elle a fonctionné pour moi -

$file = 'path/to/file.jpg';
$file = $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['HTTP_HOST'].'/'.$file;
$file_headers = @get_headers($file);
if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
    $exists = false;
}else{
    $exists = true;
}

Apparemment $_SERVER['REQUEST_SCHEME'] est un peu risqué à utiliser avec IIS 7.0 + PHP 5.3 donc vous pourriez probablement chercher une meilleure façon d'ajouter dans le protocole.

J'ai trouvé cette réponse ici http://php.net/manual/en/function.file-exists.php#75064

0
répondu kiko carisse 2017-02-07 01:45:06

J'ai passé les deux dernières heures à me demander quel était le problème avec mon if statement: file_exists($file) renvoyait false, mais je pouvais appeler include ($file) sans problème.

Il s'avère que je n'ai pas réalisé que la valeur PHP include_path que j'avais définie dans le .le fichier htaccess n'a pas été transféré vers file_exists, is_file, etc.

Ainsi:

<?PHP
// .htaccess php_value include_path '/home/user/public_html/';

// includes lies in /home/user/public_html/includes/

//doesn't work, file_exists returns false
if ( file_exists('includes/config.php') )
{
     include('includes/config.php');
}

//does work, file_exists returns true
if ( file_exists('/home/user/public_html/includes/config.php') )
{
    include('includes/config.php');
}
?>

Va juste montrer que "raccourcis pour la simplicité" comme définir le chemin include_path .htaccess peut juste causer plus de chagrin dans le long exécuter.

0
répondu Irshad Khan 2017-03-16 10:00:25

J'ai une nouvelle raison pour laquelle cela se produit - j'utilise PHP dans un conteneur Docker avec un volume monté pour la base de code qui réside sur ma machine hôte locale.

Je recevais file_exists = = FALSE (dans Composer autoload), mais si j'ai copié le chemin de fichier dans le terminal-il existait! J'ai essayé le clearstache (), vérifié le mode sans échec était éteint.

Ensuite, je me suis souvenu du mappage de volume Docker: le chemin absolu sur ma machine hôte locale n'existe certainement pas dans le Docker container-qui est la perspective de PHP sur le monde.

(j'oublie toujours que J'utilise Docker, parce que j'ai fait des fonctions shell qui enveloppent si bien les commandes docker run...)

0
répondu scipilot 2018-07-05 04:52:26