【问题标题】:PHP if file_exists() statement fails on file_get_content() from URLPHP if file_exists() 语句在来自 URL 的 file_get_content() 上失败
【发布时间】:2013-02-23 11:59:24
【问题描述】:

我有一个非常简单的函数来读取 URL 图像文件并将其保存在服务器上。

function o99_download_shot_binary(){

        $url = esc_url_raw( o99_get_content_link() ); // function returns http:// url
        $img = $uploads['basedir'] . '/tmp/' . uniqid() . '.jpeg'; // name and location
        file_put_contents($img, file_get_contents($url)); 
    }

它工作正常,但有时,o99_get_content_link() 返回无效的 URL,因此保存了一个空图像,所以我用 if 语句做了一个简单的检查并将一个衬里分开:

function o99_download_shot_binary(){

    $url = esc_url_raw( o99_get_content_link() ); // function returns http:// url
    $img = $uploads['basedir'] . '/tmp/' . uniqid() . '.jpeg'; // name and location
    $file = file_get_contents($url);
     if (file_exists($file)) {
        file_put_contents($img, $file); 
     }
}

但是这样做,没有图像被保存。

所以我尝试将 if 语句更改为

if ( $file) { file_put_contents($img, $file); }

..现在它可以工作了。

现在一切正常,你可能想知道我为什么要发布这个问题,嗯, 因为我也想了解我在做什么 - 我的问题很简单:

为什么file_exists($file) 检查失败?

我认为(可能是错误的)这是因为 file_exists() 只检查本地文件系统。如果是这种情况,那么是否有专门的功能来检查 URL 是否存在?或任何其他更好的解决方案供将来参考?

编辑我(根据 cmets 要求)

Var_dump() 是一个二进制字符串:

string(51238) "����JFIF��������BZ�|su��{��3�_�R��[J��z���K�^��g�/��9���|*�F��W~�>????tχ�>��� �&��?�~0�f�����[��i���R��_���g~�_��Ɵ�#����.5�x+�_ u��-�ٿ�L����ƺV��  ... ... ... 

但这是可以预测的,就像我在原始问题中所说,文件保存正常,这只是为什么 file_exists() 检查失败的问题,以及是否有更好的方法来对二进制文件执行检查来自 URL 的远程文件...

【问题讨论】:

  • 你能在$file = file_get_contents($url); 后面加上var_dump($file) 的输出吗?
  • file_exists() 期待像 /home/user/foo.txtc:\foo.txt 这样的路径。您正在向它提供文件的内容,而不是文件的本地路径...确实,该文件尚未存储在本地系统上。
  • @ObmerkKronen 这当然是真的。这取决于您需要认真对待它。如果这是重要数据,您可能需要围绕它进行一些错误检查。这些语句对于返回的内容是相当不可知的,它们希望您知道如何处理它们。
  • ???奥秘是什么?您要求 PHP 查找一个不存在的文件,因为您还没有保存它,并且您给了它一个虚假的路径名。当然它说它不存在。
  • @ObmerkKronen,为了大家的观看乐趣,我已经按照你的建议做了。 :)

标签: php if-statement file-get-contents file-exists


【解决方案1】:

$file = file_get_contents($url) 表示$file 包含一个字符串,即文件的内容。除非文件的内容恰好是存在的文件的路径,否则您将不会保存任何内容。

您想检查if( file_exists($url)) 并保留以前的单行。

【讨论】:

  • 感谢您的回答,但即使我理解您回答的逻辑 - 它似乎同样失败了..
  • 是的,就像我在原始问题中所说的那样,这是我怀疑的,所以剩下的问题是:除了我已经做过的事情,我还能做什么?有更好的选择吗?练习?
  • 我认为你所拥有的可能是最好的选择。另一种方法是使用套接字函数或 cURL 之类的扩展来检查实际的 HTTP 响应。
  • 谢谢..你是对的。 (不知道为什么刚刚被否决了,用cmets的长回答也被删了。)
【解决方案2】:

file_exists() 需要一个路径,例如 /home/user/foo.txtC:\foo.txt。您正在向它提供文件的内容,而不是文件的本地路径,因此它不会返回真值(当然,除非文件的内容是现有文件的有效文件路径......不是为了搅浑水,但不得不说:))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-02
    • 2019-01-26
    • 2021-10-17
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 2018-11-06
    相关资源
    最近更新 更多