【发布时间】: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.txt或c:\foo.txt这样的路径。您正在向它提供文件的内容,而不是文件的本地路径...确实,该文件尚未存储在本地系统上。 -
@ObmerkKronen 这当然是真的。这取决于您需要认真对待它。如果这是重要数据,您可能需要围绕它进行一些错误检查。这些语句对于返回的内容是相当不可知的,它们希望您知道如何处理它们。
-
???奥秘是什么?您要求 PHP 查找一个不存在的文件,因为您还没有保存它,并且您给了它一个虚假的路径名。当然它说它不存在。
-
@ObmerkKronen,为了大家的观看乐趣,我已经按照你的建议做了。 :)
标签: php if-statement file-get-contents file-exists