file_get_contents创建一个空文件
问题描述:
如何防止file_get_contents在if子句中用作测试条件时创建空文件?file_get_contents创建一个空文件
无论如何创建一个空文件,这会导致以不同的方法调用getimagesize()以后失败。
问题是,因为我有我的代码设置,它第一次被调用将决定保存图像或显示以前保存的图像。这部分取决于文件的存在。当一个空文件被创建时,这会在随后调用我的代码时导致问题。
如果文件存在并且大于0,最简单的方法是添加检查吗?
无论我的代码是否工作,file_get_contents仍然会输出一个错误。这个错误被解释和处理(由我的条件),所以我想避免错误中断我的应用程序的输出,如果可能的话。有没有办法在不隐藏实际错误的情况下关闭此功能?
if (file_put_contents($imageDir . $pk . '.jpg', file_get_contents($pic_url)))
{
return $imageDir . $pk . '.jpg';
}
else
{
return 'removed.jpg';
}
答
这不是file_get_contents()函数是创建一个空文件,它是file_put_contents()。
即使第二个参数为空,file_put_contents()也会创建一个文件。因此,空文件。
您需要先检查文件是否存在。
最简单的解决方法是在条件内移动file_put_contents(),以便只有在有内容时才创建文件。
if (($filecontents = file_get_contents($pic_url)) !== false)
{
file_put_contents($imageDir . $pk . '.jpg', $filecontents);
return $imageDir . $pk . '.jpg';
}
else
{
return 'removed.jpg';
}
现在,这仍然给你带来一堆问题。
- 除非您正确验证$ pic_url,否则您将自行开放以查找安全漏洞。如果用户输入本地文件的相对路径会怎么样?
- 如果无法找到文件,file_get_contents()将会发出警告。通常情况下,你可以通过首先检查file_exists()来处理这个问题,但这在这里是不可能的,因为http:wrapper不支持file_exists()。因此,您可以在file_get_contents()之前使用@来抑制错误。在大多数情况下应该避免像这样的错误。
- 即使您使用'@'来抑制错误,对file_get_contents()的调用可能仍需要一些时间 - 如果地址错误,可能会导致服务器无法回复,从而导致它碰到超时(可能是30秒),在此期间脚本不运行,因此最终用户无法获得反馈。这应该在您的应用中考虑到。
答
检查文件是否存在使用file_exists
:
if (file_exists($pic_url)) {
$contents = file_get_contents($pic_url);
if (!empty($contents)) {
file_put_contents($imageDir . $pk . '.jpg', $contents);
return $imageDir . $pk . '.jpg';
}
}
return 'removed.jpg';
很明显,file_exists()不被HTTP/HTTPS URL包装器支持(依赖stat支持) - 也就是说它不会在这里工作。 – thomasrutter 2009-03-02 01:25:08