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()
を使用してみてください。それが役に立たない場合は、名前を再確認します-それらは似ているかもしれませんが、同じではありません。
file_exists()
は、HTTPアドレスでは機能しません。
ファイルシステムパス(およびPHP5を使用している場合はFTP)のみをサポートします。
ご注意ください:
作品:
if (file_exists($_SERVER['DOCUMENT_ROOT']."/folder/test.txt")
echo "file exists";
動作しません:
if (file_exists("www.mysite.com/folder/test.txt")
echo "file exists";
セーフモードが原因です。オフにするか、safe_mode_include_dir
にディレクトリを含めることができます。または、それらのファイルのファイル所有権/許可を変更します。
ファイルが存在するかどうかを確認するのに役立つのは、ファイルが実行されている現在の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がなければ、非常にイライラし、見つけることはほぼ不可能でした。
ヒント:デバッグステートメントを出力するときは、値を区切り文字()または[]で囲みます。これにより、スペースがかなり明確に表示されます。そして、常に入力をトリミングすることを忘れないでください。
区切り文字として「/」の代わりにDIRECTORY_SEPARATOR
を使用してみてください。 Windowsは、LinuxおよびUnixシステムとは異なるファイルシステムパス(バックスラッシュ)の区切り文字を使用します。
親フォルダーの1つまたはファイル自体のアクセス許可の問題である可能性もあります。
Webサーバーを実行しているユーザーとしてセッションを開き、cdしてみてください。このユーザーはフォルダーにアクセス可能でなければならず、ファイルは読み取り可能でなければなりません。
そうでない場合、phpはファイルが存在しないことを返します。
とても簡単なトリックがここにあります。
次の行を書くと、falseを返します。
if(file_exists('/my-dreams-files/'.$_GET['article'].'.html'))
そして、スラッシュを開始するURLを削除して書くと、trueを返します。
if(file_exists('my-dreams-files/'.$_GET['article'].'.html'))
私はこれが起こる新しい理由があります-ローカルホストマシンにあるコードベースのマウントされたボリュームを持つDockerコンテナ内でPHPを使用しています.
私は_file_exists == FALSE
_(inside Composer autoload
)を取得していましたが、filepath
を端末にコピーした場合-存在しました!clearstatche()
、セーフモードがオフになっていることを確認しました。
それから、Dockerボリュームマッピングを思い出しました。ローカルホストマシン上の絶対パスは、Dockerコンテナー内には確かに存在しません。これは、PHPの世界観です。
(Dockerを使用していることを忘れてしまいます。これは、Dockerを実行するシェル関数を非常にうまく実行できるようにしたためです...)
この答えは少しハッキーかもしれませんが、それは私のために働いています-
$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ステートメントの何が問題なのか疑問に思って最後の2時間を過ごしました:file_exists($file)
はfalseを返していましたが、include($file)
を問題なく呼び出すことができました。
include_path
ファイルで設定したphp .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');
}
?>
.htaccessにinclude_pathを設定するような「単純化のためのショートカット」は、長い目で見ればもっと悲しみを引き起こすことができることを示します。
手動で入力してみましたか。また、2つの拡張機能は異なるケースにあるようです
var_dump(file_exists('../../images/example/001-001.jpg'));
var_dump(file_exists('../../images/example/001-001.PNG'));
@ Timur、@ Brian、@ Doug、@ Shaharの以前の回答に触発されたcustom_file_exists()関数:
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;
}