PHP的file_exists无法正常工作

7

我正在尝试让个人资料照片在我正在开发的网站上的评论列表中显示出来。如果他们没有个人资料照片,我有一张标准图像可以代替显示,但不幸的是,即使存在个人资料照片,该图像始终会显示为标准图像。以下是代码:

$reviewerPic = 'http://www.[URL].co.uk/images/members/' . $reviewPosterId . '/profilePic.jpg';
$default_pic = 'http://www.[URL].co.uk/images/background.jpg';
    if(file_exists($reviewerPic)){
        $reviewer_pic = '<img src="' . $reviewerPic . '" width="100px" style="float: left; margin: 20px;" />';
    }else {
        $reviewer_pic = '<img src="' . $default_pic . '" width="100px" style="float: left; margin: 20px;" />';
}

这段代码非常通用,但它似乎没有起作用!它只会继续显示背景图片...

你有什么想法,为什么file_exists不起作用吗?


2
看一下这个问题:https://dev59.com/4krSa4cB1Zd3GeqPU0b5 - 它几乎可以满足你的需求。 - Aleks G
8个回答

21

您正在使用的函数file_exists使用的是物理路径,您需要提供的参数应该是可以在该服务器上找到文件的地址,而不是一个 URL。

因此,您应该像这样提供参数:

/home/var/www/images/

而不是

http://www.[URL].co.uk/images/

所以你需要先检查服务器本地是否存在该文件,然后才能使用url使其对公众可用(在img src中)

从手册上可以看到,这个函数只适用于一些URL包装器,因此最好使用路径而不是URL(我猜这取决于允许的URL fopen设置)。


1
哇,你真是个天才啊,就像 PHP 的 include 文件一样……简直不敢相信我居然没试过。非常感谢!! - JackWillDavis
2
另一个棘手的时刻 - 您可以使用 file_exists('./images/filename.jpg'); PHP通过 ./ 知道Web根文件夹的位置,如果例如:您可能设置了一个新目录供Web服务器使用,则 /home/var/www/images/ 可能不是您需要的解决方案。 - Arthur Kushman
另一个有用的技巧是使用__DIR__,即使在包含PHP文件中也可以始终找到图像。因此,类似于file_exists(__DIR__ . '/../image/image.jpg');这样的代码可以确保无论如何都能找到正确的路径。 - johnsnails
@johnsnails 我猜只要你确定当前目录在chdir操作上面(现在或将来,无论是由你还是他人)不会被改变,那么这应该没问题。 - mishu

5

file_exists无法与HTTP一起使用,

请使用: $_SERVER["DOCUMENT_ROOT"] 来访问您主机中的根目录

因此,

$reviewerPic = $_SERVER["DOCUMENT_ROOT"].'/images/members/' . $reviewPosterId .  '/profilePic.jpg';
$default_pic = $_SERVER["DOCUMENT_ROOT"].'/images/background.jpg';

甚至可以使用 $_SERVER['CONTEXT_DOCUMENT_ROOT'],即使您的别名不在文档根目录下。 - Stefan

1

File_exists使用/home/www/username/public_html/格式。您可能需要从您的主机中检索此内容。

所以它会像这样:/home/www/jack/public_html/[URL].co.uk/profilepic/id/profilePic.jpg

顺便说一下,在您的echo '<img src=...中不需要使用。您可以在字符串内部使用变量,只有在需要使用函数或类似"string0".function($str....)."string1";的东西来修改它时才应该使用


1

根据 PHP 手册,file_exists 并不是所有协议都支持该函数:

此函数也可以与某些 URL 包装器一起使用。请参阅 支持的协议和包装器 以确定哪些包装器支持 stat() 功能系列。

HTTP 包装器 不支持 stat:

是否支持 stat() 否


0

尝试简单的。

$reviewerPic = 'http://www.[URL].co.uk/images/members/' . $reviewPosterId . '/profilePic.jpg';
$default_pic = 'http://www.[URL].co.uk/images/background.jpg';
    if($fileopen = @fopen($reviewerPic)){
        $reviewer_pic = '<img src="' . $reviewerPic . '" width="100px" style="float: left; margin: 20px;" />';
       fclose($fileopen);
    }else {
        $reviewer_pic = '<img src="' . $default_pic . '" width="100px" style="float: left; margin: 20px;" />';
}

0

在编程中,file_exists PHP函数仅适用于物理文件,如/var/www/file.extC:\WWW\File.ext,而不适用于HTTP文件。它甚至不知道如何处理HTTP文件。

在这种情况下,如果您想知道文件是否存在,因为它将是一个HTTP响应,您可以尝试使用curl。如果它返回404,那么文件不存在。

要了解更多信息,请参阅以下链接:http://php.net/manual/en/function.file-exists.phphttp://php.net/manual/en/book.curl.php


0

file_exists 不支持远程 URL。

你可以尝试这个:

if (fopen($reviewerPic, "r"))
   echo "File exists!";

0
一个很好的处理方法在这里~
<?php

$imgok="1.webp"; // Your actual image
$imgerr="template.webp"; // If image is missing
$dir="/assets/image/products/"; // Location of the image directory

$path = $_SERVER['DOCUMENT_ROOT'].$dir. $imgok; // Full Paths for processing

echo file_exists($path) ? $dir.$imgok : $dir.$imgerr; // Actual paths for domain to get the image

?>

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