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 2014年

Answers:


130

您至少需要使用引号将文件名括起来(作为字符串):

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

另外,请确保$filename已正确验证。然后,只有allow_url_fopen在您的PHP配置中将其激活时,它才起作用


5
我已经能够使用@GetImageSize成功地做到这一点。但是,什么将减少服务器密集型?
PaperChase 2011年

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,它将返回false。


1
如果(@getimagesize($ src)){发挥作用,谢谢,谢谢你对@这里的解释
lesolorzanov 2014年

1
getimagesize()有效,但请确保在URI中包含协议(例如,@getimagesize('//path/to/image.jpg')将不起作用)。
thdoan 2014年

file_exists或is_file对我不起作用,确实可以。谢谢!
Derk Jan Speelman'4

@getimagesize将大大减慢页面加载速度。不建议。可以使用is_file代替,并确保$ src不是完整的URL:“ http:// ...”而是“ img / ...”
Bogdan C

is_file和file_exists都不适用于图像,但是@getimagesize可以正常工作。
Alam Zaib

14

好吧,file_exists不是说文件是否存在,而是说路径是否存在。⚡⚡⚡⚡⚡⚡⚡

因此,要检查它是否是文件,则应is_file与一起使用, file_exists以了解路径后是否确实存在文件,否则file_exists将返回true任何现有路径。

这是我使用的功能:

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

2
当路径包含文件名时,如何存在该路径,但该文件不存在?
安德鲁(Andrew)

1
我的意思是,即使用户提供路径而不是文件,它也可以正常工作,即使它不是我的朋友,该函数也将返回true。
Rizerzero 2015年

进行有趣且可能重要的区分。但是,如果您检查文档,则看来您只需要使用is_file即可,而无需与file_exists一起使用。
安德鲁(Andrew)

好的,让我总结一下,(使用:PaperChase)想检查一个file_exists,他的问题是,即使他给出了该函数的路径,他也会得到一个真实的响应,因此要清楚地检查一个文件是否存在然后他将使用My函数,因为即使传递路径,php函数也将返回true,所以函数名不正确,应为Path_exists()并且My function确实检查文件是否存在,因为如果返回则返回false除了现有文件路径以外的任何东西都会被传递。我希望这是现在清除。
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

首先要了解的一点是:您没有文件
文件是文件系统的主题,但是您正在使用HTTP协议发出请求,该协议仅支持URL,不支持任何文件。

因此,您必须使用浏览器请求不存在的文件并查看响应代码。如果不是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:

如果文件名指定的文件或目录存在,则返回TRUE;否则,返回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,该ABSPATH可以在全球范围内用于使用您的代码以及网站网址来处理服务器上的文件。

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";

}

我在这里再走一英里:)。因为此代码不需要太多维护且非常可靠,所以我将用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;
}

}

参考网址: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

使用从HTTP读取前5个字节fopen()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上。
彼得

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.