2009-03-01 67 views
2

如何防止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'; 
} 

回答

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秒),在此期间脚本不运行,因此最终用户无法获得反馈。这应该在您的应用中考虑到。
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'; 
+0

很明显,file_exists()不被HTTP/HTTPS URL包装器支持(依赖stat支持) - 也就是说它不会在这里工作。 – thomasrutter 2009-03-02 01:25:08