У меня очень странная проблема с 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, могут в конечном итоге вызвать больше горя.