PHP:画像ファイルが存在するかどうかを確認する方法は?


97

特定のイメージがCDNに存在するかどうかを確認する必要があります。

私は以下を試しましたが、うまくいきません:

if (file_exists(http://www.example.com/images/$filename)) {
    echo "The file exists";
} else {
    echo "The file does not exist";
}

画像が存在する場合でも存在しない場合でも、常に「ファイルが存在します」と表示されます。なぜ機能しないのかわかりません...


1
サーバーファイルシステムのファイルへのフルパスを使用する必要があります(例: '/home/you/public/img/sample.gif')。
user9440008

file_exists離れた場所へのアクセスが非常に遅くなる場合があるので、これには注意してください。
crmpicco 14

回答:


130

少なくとも(文字列として)引用符で囲んだファイル名が必要です。

if (file_exists('http://www.mydomain.com/images/'.$filename)) {
  }

また、$filename適切に検証されていることを確認してください。そして、それはallow_url_fopenあなたのPHP設定でアクティブ化されている場合にのみ機能します


5
@GetImageSizeを使用して正常に実行できました。ただし、サーバーの負荷が軽減されるものは何ですか。
PaperChase

9
file_exists()は、URLではなく、ハードドライブ上のファイルパスを使用する必要があります。これは、私にとっては有用な回答ではありません。
マーティン

PHPから:bool file_exists(string $ filename)PHP 5.0.0以降、この関数は一部のURLラッパーでも使用できます。サポートされているプロトコルとラッパーを参照して、stat()ファミリーの機能をサポートするラッパーを判別してください。
Adrian P.

$ filename文字列がnullの場合、file_existsはディレクトリに対してtrueを返します。is_file($ filepath)を使用する方が良い
PodTech.io

1
人々が言っ​​たように、それはリモートのURL /パスでは機能しません。ただし、ローカルパス(ファイルが配置されている内部サーバーパス)で機能します。また、他の方法では、リモートは14秒、ローカルは1秒未満かかります(特定の例の場合)
Rafa

110
if (file_exists('http://www.mydomain.com/images/'.$filename)) {}

これは私にはうまくいきませんでした。私がやった方法はgetimagesizeを使うことでした。

$src = 'http://www.mydomain.com/images/'.$filename;

if (@getimagesize($src)) {

'@'は、画像が存在しない場合(この場合、関数は通常エラーをスローしますgetimagesize(http://www.mydomain.com/images/filename.png) [function.getimagesize]: failed)を意味することに注意してください。


1
if(@getimagesize($ src)){不思議に動作します、ありがとう、追加@ここで@の説明を
ありがとう

1
getimagesize()は機能しますが、必ずプロトコルをURIに含めてください(たとえば、機能し@getimagesize('//path/to/image.jpg')ません)。
thdoan 2014

file_existsまたはis_fileが機能しませんでした。ありがとうございました!
Derk Jan Speelman 2017

@getimagesizeはページの読み込みを劇的に遅くします。推奨されません。is_fileを代わりに使用して、$ srcが完全なURLではないことを確認してください: "http:// ..."ではなく "img / ..."
Bogdan C

is_fileとfile_existsはどちらも画像に対しては機能しませんが、@ getimagesizeは正常に機能します。
アラムザイブ2018年

14

まあ、file_existsファイルが存在するかどうかは言いませんが、パスが存在するかどうかは言います。⚡⚡⚡⚡⚡⚡⚡

したがって、それがファイルかどうかを確認するには、とis_file一緒に使用して file_exists、パスの後ろに実際にファイルがあるかどうかを確認する必要があります。そうでない場合file_existstrue、既存のパスに戻ります。

これが私が使用する関数です:

function fileExists($filePath)
{
      return is_file($filePath) && file_exists($filePath);
}

2
パスにファイル名が含まれている場合、パスは存在するがファイルは存在しないのはなぜですか?
Andrew

1
つまり、ユーザーがファイルではなくパスを指定した場合でも機能し、友人ではない場合でも関数はtrueを返します。
Rizerzero 2015年

興味深い、潜在的に重要な差別化。しかし、ドキュメントを確認すると、この目的でis_fileを使用するだけでよく、file_existsと組み合わせて使用​​する必要はないようです。
アンドリュー

わかりました。これをまとめてみましょう。(PaperChaseを使用)は、file_existsが存在するかどうかを確認します。彼の問題は、関数へのパスを指定した場合でも、真の応答が返されるため、ファイルが存在するかどうかを明確に確認することです。パスが渡されてもphp関数はtrueを返すため、彼はMy関数を使用します。そのため、関数名は不正であり、Path_exists()である必要があります。My関数は、ファイルが存在するかどうかを実際に確認します。既存のファイルパス以外のものが渡されます。私はこれが今クリアであることを望みます。
Rizerzero

はい、それはうまくいきますが、php.net / manual / en / function.is- file.phpによると、is_file()はパス/ファイルが存在するかどうかをチェックしてからファイルであるかどうかをチェックするので、 。
アンドリュー

13

このようにしてみてください:

$file = '/path/to/foo.txt'; // 'images/'.$file (physical path)

if (file_exists($file)) {
    echo "The file $file exists";
} else {
    echo "The file $file does not exist";
}

9

ファイルが存在するかどうかを確認する最も簡単な方法は次のとおりです。

if(is_file($filename)){
    return true; //the file exist
}else{
    return false; //the file does not exist
}

8

最初に理解しておくべきこと:ファイルがない
ファイルはファイルシステムの対象ですが、URL以外のファイルをサポートしないHTTPプロトコルを使用してリクエストを作成しています。

そのため、ブラウザを使用して存在しないファイルをリクエストし、応答コードを確認する必要があります。404でない場合、ラッパーを使用してファイルが存在するかどうかを確認できず、FTPなどの他のプロトコルを使用してcdnを要求する必要があります。


7
public static function is_file_url_exists($url) {
        if (@file_get_contents($url, 0, NULL, 0, 1)) {
            return 1;
        }

        return 0;           
    }

7

ファイルがローカルドメインにある場合は、完全なURLを入力する必要はありません。ファイルへのパスのみ。ファイルが別のディレクトリにある場合は、パスの前に「。」を付ける必要があります。

$file = './images/image.jpg';
if (file_exists($file)) {}

多くの場合、「。」実際には存在する場合、ファイルが存在しないものとして表示されます。


3

との間には大きな違いがis_fileありfile_existsます。

is_file (通常の)ファイルに対してtrueを返します。

ファイル名が存在し、通常のファイルである場合TRUEを返し、そうでない場合はFALSEを返します。

file_exists ファイルとディレクトリの両方でtrueを返します。

filenameで指定されたファイルまたはディレクトリが存在する場合はTRUEを返します。それ以外の場合はFALSE


注: このトピックの詳細については、このStackoverflowの質問も確認してください。


2

ファイルが存在するかどうかを確認するには、絶対パスを使用する必要があります。

$abs_path = '/var/www/example.com/public_html/images/';
$file_url = 'http://www.example.com/images/' . $filename;

if (file_exists($abs_path . $filename)) {

    echo "The file exists. URL:" . $file_url;

} else {

    echo "The file does not exist";

}

CMSまたはPHPフレームワークを記述している場合、私が知る限り、それらすべてがドキュメントルートパスの定数を定義しています。

たとえば、WordPressはABSPATHを使用します。これは、コードとサイトのURLを使用してサーバー上のファイルを操作するためにグローバルに使用できます。

Wordpressの例:

$image_path = ABSPATH . '/images/' . $filename;
$file_url = get_site_url() . '/images/' . $filename;

if (file_exists($image_path)) {

    echo "The file exists. URL:" . $file_url;

} else {

    echo "The file does not exist";

}

ここでさらに1マイル進みます:)。このコードはそれほどメンテナンスを必要とせず、かなりしっかりしているので、ifステートメントを簡略化して記述します。

$image_path = ABSPATH . '/images/' . $filename;
$file_url = get_site_url() . '/images/' . $filename;

echo (file_exists($image_path))?'The file exists. URL:' . $file_url:'The file does not exist';

省略されたIFステートメントの説明:

$stringVariable = ($trueOrFalseComaprison > 0)?'String if true':'String if false';

2

cURLを使用できます。cURLを取得して、本体ではなくヘッダーのみを提供することができます。リクエストのタイムアウトを待機するため、不良ドメインは常にしばらく時間がかかる可能性があります。おそらくcURLを使用してタイムアウトの長さを変更できます。

次に例を示します。

function remoteFileExists($url) {
$curl = curl_init($url);

//don't fetch the actual page, you only want to check the connection is ok
curl_setopt($curl, CURLOPT_NOBODY, true);

//do request
$result = curl_exec($curl);

$ret = false;

//if request did not fail
if ($result !== false) {
    //if request was ok, check response code
    $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);  

    if ($statusCode == 200) {
        $ret = true;   
    }
}

curl_close($curl);

return $ret;
}
$exists = remoteFileExists('http://stackoverflow.com/favicon.ico');
if ($exists) {
echo 'file exists';
} else {
   echo 'file does not exist';   
}


1

curlを使用している場合は、次のスクリプトを試すことができます。

function checkRemoteFile($url)
{
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL,$url);
 // don't download content
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if(curl_exec($ch)!==FALSE)
{
    return true;
}
else
{
    return false;
}

}

参照URL:https : //hungred.com/how-to/php-check-remote-email-url-image-link-exist/


1
ここでタイムアウトが必要
Mike Q

1

これを試して :

if (file_exists(FCPATH . 'uploads/pages/' . $image)) {
    unlink(FCPATH . 'uploads/pages/' . $image);
}

1

画像へのパスがアプリケーションルートからの相対パスである場合は、次のようなものを使用することをお勧めします。

function imgExists($path) {
    $serverPath = $_SERVER['DOCUMENT_ROOT'] . $path;

    return is_file($serverPath)
        && file_exists($serverPath);
}

この関数の使用例:

$path = '/tmp/teacher_photos/1546595125-IMG_14112018_160116_0.png';

$exists = imgExists($path);

if ($exists) {
    var_dump('Image exists. Do something...');
}

ライブラリのようなものを作成して、さまざまな状況に適用できるイメージの存在を確認することをお勧めします。このタスクを解決するために使用できる多くのすばらしい答えの上に。


0

を使用fopen()してHTTPから最初の5バイトを読み取りfread()、これを使用します。

DEFINE("GIF_START","GIF");
DEFINE("PNG_START",pack("C",0x89)."PNG");
DEFINE("JPG_START",pack("CCCCCC",0xFF,0xD8,0xFF,0xE0,0x00,0x10)); 

画像を検出します。


一般的な404画像があるかもしれません
常識

2
はい-画像は指定されたURLに存在します。
Peter

0

file_existsファイルだけでなくパスも読み取ります。ときに$filename空になって、それがこのように書かれているかのように、コマンドが実行されます:

file_exists("http://www.example.com/images/")

/ images /ディレクトリが存在する場合でも、関数はを返しtrueます。

私は通常、次のように書きます。

// !empty($filename) is to prevent an error when the variable is not defined
if (!empty($filename) && file_exists("http://www.example.com/images/$filename"))
{
    // do something
}
else
{
    // do other things
}

0

file_exists($filepath) ディレクトリと完全なファイルパスの真の結果を返すため、ファイル名が渡されない場合は常に解決策とは限りません。

is_file($filepath) 完全なファイルパスに対してのみtrueを返します


0

file_existsのサーバーパスが必要です

例えば

if (file_exists('/httpdocs/images/'.$filename)) {echo 'File exist'; }

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.