【问题标题】:How to prevent having the "is not a valid image file" error when using GD function imagecreatefrom* in php?在 php 中使用 GD 函数 imagecreatefrom* 时如何防止出现“不是有效的图像文件”错误?
【发布时间】:2011-12-17 12:14:04
【问题描述】:

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

我确实尝试了以下一些方法来验证图像(如其他帖子中所建议的那样),但它们都不能在所有情况下工作。如果图像没有标头信息,则以下方法有效,但如果图像具有标头/mime 类型信息并且已损坏,则不起作用。

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

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

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

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

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

感谢您的帮助和建议。

【问题讨论】:

标签: php image gd imagecreatefrompng


【解决方案1】:

你可以试试

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

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

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

编辑:

请注意,在此示例中,@运算符也会抑制 file_get_contents 函数中的任何错误。

【讨论】:

  • 这是我能想到的最佳解决方案。我发现的所有其他解决方案都会分析文件类型的 URL,但是这个不需要而且更可靠;特别是如果从 URL 中看不到文件类型。此外,它节省了大量代码。谢谢。
  • 不错的一个!我可以用这个处理很多文件,但我有一种情况(只有 1 个文件),脚本显示“图像已损坏”,但我可以在浏览器(Firefox 32.0)中看到图像,所以我猜 GD 不是准备克服小错误(再次,图像在浏览器中正确显示,也在图像查看器中)
猜你喜欢
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多