如何防止在php中使用GD函数imagecreatefrom *时出现“不是有效的图像文件”错误?

时间:2011-10-28 18:22:44

标签: php image gd imagecreatefrompng

我正在使用imagecreatefromgif / imagecreatefromjpeg / imagecreatefromjpeg函数和上传的图像,有时会在图像损坏时出现错误(例如警告:imagecreatefromgif():...不是有效的GIF文件)。我阅读了很多关于这个主题的帖子,找不到“有效”的答案。

我确实尝试了以下一些方法来验证图像(如其他帖子所示),但它们都没有在所有情况下都有效。如果图像没有标题信息,则以下方法有效,但如果图像具有标题/ mime类型信息且已损坏,则无效。

if( imagecreatefromjpeg($uploaded_image) !== false ) {
    // image is okay.
}

OR

try {
    $test = imagecreatefrompng($uploaded_image);
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

OR

使用getimagesize($ uploaded_image); //如果图像无效,将返回false或错误。

这些情况都不适用于具有标题信息/ mime类型信息的损坏的图像文件。

我想防止出现这些错误,如果可能的话,检测图像是否没有损坏,并且可以使用任何imagecreatefromgif / imagecreatefromjpeg / imagecreatefromjpeg函数。如果损坏,我想显示错误消息而不是运行功能。我正在寻找PHP的解决方案。

感谢您的帮助和建议。

1 个答案:

答案 0 :(得分:8)

你可以尝试

$gd = @imagecreatefromstring(file_get_contents($file_path));    
    if ($gd === false) {
        throw new Exception ('Image is corrupted');
    }

它应该适用于gd已知的大多数图像格式。此外,如果您需要特定的错误消息,可以使用error_get_last()。

@将禁止显示错误消息,imagecreatefromstring会尝试打开已知的图像格式。如果失败,$ gd将具有值'false'并且不会抛出任何错误消息。

编辑:

请注意,在这个例子中,@ operator也会从file_get_contents函数中获取任何错误。