it-swarm.com.de

file_exists () gibt false zurück, aber die Datei existiert

Ich habe ein sehr seltsames Problem mit file_exists (). Ich verwende diese Funktion, um zu überprüfen, ob zwei verschiedene Dateien in denselben Ordnern vorhanden sind. Ich habe es noch einmal geprüft, es gibt BEIDE.

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

Jetzt verwenden wir file_exists () für diese:

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)

Ich verstehe es nicht - beide Dateien existieren. Ich verwende Windows, daher ist es nicht auf ein Problem mit der Groß- und Kleinschreibung bezogen. Der abgesicherte Modus ist ausgeschaltet.

Erwähnenswert ist jedoch, dass der .png-Server von einem Benutzer über FTP hochgeladen wird, während der .jpg-Ordner mithilfe eines Skripts erstellt wird. Aber soweit ich weiß, sollte das keinen Unterschied machen.

Irgendwelche Tipps?

Vielen Dank

29
Bv202

Die Ergebnisse von file_exists() werden zwischengespeichert. Versuchen Sie es mit clearstatcache(). Wenn dies nicht geholfen hat, überprüfen Sie die Namen erneut - sie sind möglicherweise ähnlich, aber nicht identisch.

19
Timur

Ich habe herausgefunden, dass das, was für mich funktioniert, um zu überprüfen, ob eine Datei existiert (relativ zur aktuellen PHP-Datei, von der sie ausgeführt wird) der folgende Code ist:

$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
Shahar

Es ist wegen des abgesicherten Modus. Sie können es deaktivieren oder das Verzeichnis in safe_mode_include_dir aufnehmen. Oder ändern Sie den Dateibesitz bzw. die Berechtigungen für diese Dateien.

php.net: file_exists ()
php.net: abgesicherter Modus

11
ace

file_exists() funktioniert einfach nicht mit HTTP-Adressen. 

Es unterstützt nur Dateisystempfade (und FTP, wenn Sie PHP5 verwenden.)

bitte beachten Sie:

hat funktioniert :

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

nicht funktioniert :

if (file_exists("www.mysite.com/folder/test.txt") 
    echo "file exists";
11
Mahdi Loghmani

Nur meine $ .02: Ich hatte gerade dieses Problem und es lag an einem Leerzeichen am Ende des Dateinamens. Es ist nicht immer ein Wegproblem - obwohl ich das als erstes überprüfe - immer. Ich könnte den Dateinamen mit dem Befehl ls -l ausschneiden und in ein Shell-Fenster einfügen. Dadurch wird die Datei natürlich lokalisiert, da die Befehlszeile den Bereich ignoriert, in dem sich file_exists nicht befindet. Sehr frustrierend und fast unmöglich zu finden, wäre StackOverflow nicht.

TIPP: Wenn Sie Debug-Anweisungen ausgeben, schließen Sie Werte mit Trennzeichen () oder [] ein. Dadurch wird ein Leerzeichen deutlich angezeigt. Denken Sie immer daran, Ihre Eingabe zu trimmen.

9
Brian

Versuchen Sie, DIRECTORY_SEPARATOR anstelle von '/' als Trennzeichen zu verwenden. Windows verwendet ein anderes Trennzeichen für Dateisystempfade (Backslash) als Linux- und Unix-Systeme.

2
Doug

Es kann sich auch um ein Berechtigungsproblem in einem der übergeordneten Ordner oder der Datei selbst handeln.

Versuchen Sie, eine Sitzung als Benutzer zu öffnen, auf dem Ihr Webserver ausgeführt wird, und eine CD einzulegen. Der Ordner muss für diesen Benutzer zugänglich sein und die Datei muss lesbar sein.

Wenn nicht, gibt PHP zurück, dass die Datei nicht existiert.

1
Julien Ricard

Ein sehr einfacher Trick ist hier, dass für mich gearbeitet hat.

Wenn ich die folgende Zeile schreibe, wird falsch zurückgegeben.

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

Und wenn ich mit dem Entfernen des URL-Schrägstrichs schreibe, wird "true" zurückgegeben.

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

Ich habe einen neuen Grund, warum dies geschieht. Ich verwende PHP in einem Docker-Container mit einem bereitgestellten Volume für die Codebase, die sich auf meinem lokalen Host-Computer befindet.

Ich bekam file_exists == FALSE (in Composer autoload), aber wenn ich die filepath in das Terminal kopierte, gab es sie! Ich habe die clearstatche() ausprobiert und den abgesicherten Modus auf AUS gesetzt.

Dann erinnerte ich mich an das Docker-Volume-Mapping: Der absolute Pfad auf meinem lokalen Host-Computer existiert sicherlich nicht im Docker-Container - was PHP aus der Welt betrachtet.

(Ich vergesse immer wieder, dass ich Docker benutze, weil ich Shell-Funktionen gemacht habe, die die Docker-Run-Befehle so schön umschließen ...)

1
scipilot

Diese Antwort mag ein bisschen hackig sein, aber sie hat für mich gearbeitet -

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

anscheinend ist $_SERVER['REQUEST_SCHEME'] ein wenig zweifelhaft für die Verwendung mit IIS 7.0 + PHP 5.3, so dass Sie wahrscheinlich nach einem besseren Weg suchen, das Protokoll hinzuzufügen.

Ich fand diese Antwort hier http://php.net/manual/de/function.file-exists.php#75064

0
kiko carisse

Ich verbrachte die letzten zwei Stunden damit, mich zu fragen, was mit meiner if-Anweisung falsch war: file_exists($file) gab false zurück, jedoch konnte ich include($file) ohne Problem aufrufen.

Es stellte sich heraus, dass ich nicht wusste, dass der php include_path-Wert, den ich in der .htaccess-Datei eingestellt hatte, nicht auf file_exists, is_file usw. übertragen wurde.

Somit:

<?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');
}
?>

Das zeigt nur, dass "Abkürzungen für die Einfachheit", wie das Setzen des include_path in .htaccess, auf lange Sicht nur mehr Kummer verursachen kann.

0
Irshad Khan

hast du die manuelle Eingabe versucht? auch Ihre beiden Erweiterungen scheinen in unterschiedlichen Fällen zu sein

   var_dump(file_exists('../../images/example/001-001.jpg'));
   var_dump(file_exists('../../images/example/001-001.PNG'));
0
amigura

Eine custom_file_exists () - Funktion, inspiriert von den vorangegangenen Antworten von @Timur, @Brian, @Doug und @Shahar:

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
RafaSashi