在 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';
}
创建空文件的不是 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: 包装器不支持 file_exists()。因此,您可以在 file_get_contents() 之前使用 @ 来抑制错误。大多数情况下应该避免抑制这样的错误。
- 即使您使用“@”抑制错误,对 file_get_contents() 的调用仍可能需要一些时间 - 如果地址错误,可能会导致无法从服务器获得回复,这将导致超时(可能是30 秒),在此期间您的脚本不会运行,因此最终用户无法获得任何反馈。您的应用程序中应考虑到这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)