file_exists () возвращает false, но файл существует

У меня очень странная проблема с file_exists (). Я использую эту функцию, чтобы проверить, существуют ли 2 разных файла в одних и тех же папках. Я дважды проверял, они оба существуют.

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 

Теперь давайте используем file_exists ():

 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) 

Я не понимаю – оба эти файла существуют. Я запускаю Windows, поэтому он не связан с вопросом, чувствительным к регистру. Безопасный режим выключен.

Однако стоит упомянуть, что .png один загружается пользователем через FTP, а .jpg один создается с помощью скрипта. Но, насколько я знаю, это не должно иметь значения.

Какие-нибудь советы?

благодаря

Результаты file_exists() кэшируются, поэтому попробуйте использовать clearstatcache() . Если это не помогло, перепроверьте имена – они могут быть похожими, но не одинаковыми.

Это из-за безопасного режима. Вы можете отключить его или включить каталог в safe_mode_include_dir. Или измените права на файлы / разрешения для этих файлов.

php.net: file_exists ()
php.net: безопасный режим

Я обнаружил, что то, что работает для меня, чтобы проверить, существует ли файл (относительно текущего файла php, который он выполняется), является частью кода:

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

Просто мои $ .02: у меня была эта проблема, и это было из-за пробела в конце имени файла. Это не всегда проблема пути, хотя это первое, что я проверяю – всегда. Я мог бы вырезать и вставить имя файла в окно оболочки с помощью команды ls -l и, конечно же, найти файл, потому что в командной строке будет игнорироваться пространство, в котором нет файлов file_exists. Очень расстраивать действительно и почти невозможно найти, если бы не StackOverflow.

СОВЕТ. При выводе операторов отладки заключают значения с разделителями () или [], и это будет довольно ясно отображать пробел. И всегда помните, чтобы обрезать ваш вход.

file_exists() просто не работает с HTTP-адресами.

Он поддерживает только пути файловой системы (и FTP, если вы используете PHP5.)

пожалуйста, обратите внимание:

работал :

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

не работал:

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

Попробуйте использовать DIRECTORY_SEPARATOR вместо '/' в качестве разделителя. Windows использует другой разделитель для путей файловой системы (обратная косая черта), чем системы Linux и Unix.

Это также может быть проблемой разрешения на одну из родительских папок или самого файла.

Попробуйте открыть сеанс как пользователь, который запускает ваш веб-сервер и cd. Папка должна быть доступна этому пользователю, и файл должен быть доступен для чтения.

Если нет, php вернет, что файл не существует.

Здесь очень простой трюк, который работал на меня.

Когда я пишу следующую строку, она возвращает false.

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

И когда я пишу с удалением URL-адреса, начинающегося слэш, он возвращает true.

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

вы попробовали ручную запись. также ваши два расширения, похоже, в другом случае

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

Функция custom_file_exists (), вдохновленная ответами @Timur, @Brian, @Doug и @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; } 

Этот ответ может быть немного взломан, но он работает для меня –

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

По-видимому, $_SERVER['REQUEST_SCHEME'] немного рискован для использования с IIS 7.0 + PHP 5.3, поэтому вы, вероятно, можете найти лучший способ добавить в протокол.

Я нашел этот ответ здесь http://php.net/manual/en/function.file-exists.php#75064

Последние два часа я размышлял о том, что случилось с моим if: file_exists ($ file) возвращал false, однако я мог бы назвать include ($ file) без проблем.

Оказывается, я не понимал, что значение php include_path, которое я установил в файле .htaccess, не переносилось на file_exists, is_file и т. Д.

Таким образом:

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

Просто идет, чтобы показать, что «ярлыки для простоты», такие как установка include_path в .htaccess, могут в конечном итоге вызвать больше горя.