file_get_contents创建一个空文件

时间:2009-03-01 21:51:03

标签: php

如果在if子句中用作测试条件时,如何防止file_get_contents创建空文件?

无论如何都会创建一个空文件,这会导致后续调用另一种方法使getimagesize()失败。

问题是,当我进行代码设置时,第一次调用它将决定保存图像或显示先前保存的图像。这部分取决于文件的存在。由于创建了一个空文件,因此在以后调用我的代码时会出现问题。

如果文件存在并且大于0,是添加检查的最简单方法吗?

无论我的代码是否有效,file_get_contents仍会输出错误。这个错误被解释和处理(通过我的if条件),所以我想避免错误中断我的应用程序的输出,如果可能的话。有没有办法在不隐藏实际错误的情况下关闭它?

if (file_put_contents($imageDir . $pk . '.jpg', file_get_contents($pic_url))) 
{
        return $imageDir . $pk . '.jpg'; 
} 
else 
{
        return 'removed.jpg';
}

2 个答案:

答案 0 :(得分:3)

使用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';

答案 1 :(得分:1)

创建空文件的不是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秒),在此期间您的脚本不会运行,因此最终用户无法获得反馈。这应该在您的应用中加以考虑。