PHP:如何检查图像文件是否存在?

111

我需要查看CDN中是否存在特定的图片。

我尝试了以下方法,但没有成功:

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

即使图片存在或不存在,它总是显示"文件已存在"。我不确定为什么它不起作用...


请注意,如果您尝试对远程位置执行 file_exists 操作,可能会非常缓慢。 - crmpicco
@user9440008 你好 在file_exist函数中使用PATH而不是URL是很好的选择。 您能否解释一下如何从CDN服务器访问路径而不是URL? - Syed Imran Ertaza
22个回答

142

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

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

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


5
我可以使用@GetImageSize成功完成它。不过,什么方法会减少服务器的负载? - PaperChase
10
file_exists()需要使用硬盘上的文件路径,而不是URL。这对我来说并不是有用的答案,不应该被设置为已接受的答案。 - Martin
从PHP:bool file_exists(string $filename)根据PHP 5.0.0的版本,此函数还可以与某些URL包装器一起使用。请参阅支持的协议和包装器以确定哪些包装器支持stat()功能族。 - Adrian P.
如果$filename字符串为空,则file_exists将针对目录返回true。最好使用is_file($filepath)。 - PodTech.io
1
正如人們所說,它不能在遠程URL /路徑上運行。但是它可以在本地路徑 (文件位於的內部伺服器路徑) 上運行。此外,從其他方法來看,遠程需要長達14秒的時間,而本地只需要不到1秒的時間(對於某些示例來說)。 - Rafa

126
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
1
getimagesize() 可以使用,但请确保在 URI 中包含协议(例如 @getimagesize('//path/to/image.jpg') 是无法工作的)。 - thdoan
file_exists或is_file对我没有起作用,但这个方法可以。谢谢! - Derk Jan Speelman
@getimagesize会大大减慢页面加载速度。不建议使用。可以使用is_file代替,并确保$src不是完整的URL:“http://...”,而是“img/...”。 - Bogdan C
is_file和file_exists两者都不能用于图片,但@getimagesize运行正常。 - Alam Zaib
@Jeffrey Jenkinson - 在tcpdf中它正在工作。谢谢。 - Mr. Aniket

15

可以尝试这样做:

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

14

好的,file_exists函数并不能判断文件是否存在,它只能判断路径是否存在。 ⚡⚡⚡⚡⚡⚡⚡

因此,如果要检查是否为文件,则应该将 is_filefile_exists结合使用,以了解路径后面是否实际上有一个文件,否则 file_exists 对于任何现有路径都会返回true

这是我使用的函数:

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

2
当路径包含文件名时,怎么可能存在路径但文件不存在呢? - Andrew
1
我的意思是,即使用户提供的是路径而不是文件,该函数也能正常工作。即使它不是一个文件,该函数也会返回true,我的朋友。 - Rizerzero
是的,它可以正常工作,但根据http://php.net/manual/en/function.is-file.php的说明,is_file()在检查文件是否为文件之前已经检查了路径/文件是否存在,因此您不需要这样做。 - Andrew
如果你说“干草堆里找针”或者“在针里找干草”,那我们就都认为 PHP 有多糟糕了。而且,函数名字毫无意义,is_file 应该检查是否是文件,file_exists 只应该对存在的文件返回 true,他们还可以添加一个 path_exists... - Rizerzero
文件的完整路径包括了它的文件名及扩展名。所以这个路径可以是一个文件,但也可以只是一个目录的路径。我同意file_exists( ... )函数可能被命名错误了。无论如何,你的函数是多余的。你可以把现有的is_file( ... )用另一个名称保存,它将与你的函数一样工作。祝大家节日快乐! - s3c
显示剩余4条评论

9

以下是检查文件是否存在的最简单方法:

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

8
如果文件在本地域中,您无需输入完整的URL,只需输入文件路径即可。如果文件位于另一个目录中,则需要在路径前加"."。
$file = './images/image.jpg';
if (file_exists($file)) {}

经常会忘记加上“.”,导致文件显示为不存在,但实际上文件是存在的。


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

4

is_filefile_exists之间有一个重大区别。

is_file返回(常规)文件的真值:

如果文件名存在且为常规文件,则返回TRUE,否则返回FALSE

file_exists对于文件和目录都返回真值:

如果由文件名指定的文件或目录存在,则返回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";

}

我在这里做了额外的努力 :). 因为这段代码不需要太多维护并且非常稳定,所以我会使用简写 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';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接