【问题标题】:Is there any way to have PHP detect a corrupted image?有什么方法可以让 PHP 检测到损坏的图像?
【发布时间】:2011-07-04 06:55:41
【问题描述】:

有什么方法可以让 PHP 判断一个图像文件是否损坏而无法正常显示?

我尝试过检查fopen并检查URL是否有效,但没有成功!

【问题讨论】:

  • 损坏或丢失?
  • PHP 不显示图像,浏览器 可以。也许您的意思是 PHP 将无法将其发送到浏览器...
  • 是的,我的意思是损坏了,我应该更清楚。对不起。如果它已损坏,我需要 PHP 不将其发送到浏览器。

标签: php image detect corrupt


【解决方案1】:

有什么方法可以让 PHP 判断图像文件是否损坏

如果您所说的损坏是指损坏,则更改是 imagecreatefrom{extension} 也无法读取它们:

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

【讨论】:

  • 有时这是个好主意,有时不是。如果出现错误,它可能会发出警告。使用@ 可以忽略警告,但也会忽略难以调试的“致命错误:未找到函数”错误。此外,当我在 PHP 文件上使用 imagecreatefromjpeg() 时,HTTP 请求失败并在 Firefox 中显示“连接已重置”消息,我收到“PHP 警告:imagecreatefromjpeg(): gd-jpeg :JPEG 库在 Apache(不是 PHP!)的日志中报告不可恢复的错误”错误,这也很难调试。恕我直言,这是个坏主意。
  • @binaryLV 我显然不是指实时检查。当访问者正在观看页面时,您不应该做这样的事情,但在单独的脚本中是可以的。另外,我的 PHP 错误日志中出现了错误,所以这可能是您的配置。我不认为这是一个坏主意,只要您自己运行脚本,而不是在每个页面视图上都使用它(这会打扰访问者)。
  • imagecreatefromstring 做到了这一点......但不幸的是它做得太好......它检查图像是否损坏......但我正在做的是显示损坏/故障的图像......不同之处在于有些图像虽然损坏但可以显示,但其他图像无法显示...我必须能够区分...所以我需要区分损坏的图像,它是可显示和可打开的图像。 ..
  • @Piotr 那样的话,恐怕我要让你失望了:PHP 中没有任何函数可以模仿浏览器,打开文件并“查看”到我知道。
  • hmmm... 我也可以用 PHP 获得尺寸,先试试吧! :)
【解决方案2】:

Javascript 解决方案(涉及到 jQuery,尽管没有它也应该可以做到):

<script type='text/javascript'>
    $(function(){
        var files = [
            'warning-large.png',
            'warning-large-corrupted.png',
            'http://www.example.com/none.gif',
            'http://sstatic.net/stackoverflow/img/favicon.ico'
        ];
        for ( var n in files ) {
            var img = $('<img/>');
            img.error(function(){
                alert('error:\n' + this.src);
            });
            img.load(function(){
                alert('success:\n' + this.src);
            });
            img.attr('src', files[n]);
        }
    });
</script>

【讨论】:

    【解决方案3】:

    如果您的意思是像 404 一样损坏,而不是损坏的图像,您可以随时使用以下内容:

    if (file_exists($imageFileName)) {
      ..
    }
    

    【讨论】:

    • 请记住,file_exists() 同时检查文件和目录。我建议使用is_file()
    • 好的,所以 imagecreatefromstring 似乎完成了工作......现在我有一个不同的问题 - 那是因为我正在显示的图像已经出现故障......所以我需要它关闭关于图像被扭曲...如果显示正常,那很好...所以警告现在就在路上。
    • 没关系...找到了解决方案。非常感谢所有花时间提供帮助的人! :)
    【解决方案4】:

    这对我有用 100% :) 我通过 file_exists() 测试图像是否存在,如果存在,您将使用它捕获损坏的图像。

    <img src="your_image_source" onerror="this.src='/path/to/backup/file'">
    

    【讨论】:

      【解决方案5】:

      如果文件在您的服务器上,请使用 php 中的 file_exists 函数检查

      http://php.net/manual/en/function.file-exists.php

      【讨论】:

      • 请记住,file_exists() 同时检查文件和目录。我建议使用is_file()
      • 嗨,谢谢,但这不起作用......它仍然认为图像是有效的,即没有损坏,并尝试显示它......只有它显示它与“损坏的图像”图标...
      • 您的图片不存在或已损坏?
      • 如果它损坏然后尝试使用 mime_content_type php.net/manual/en/function.mime-content-type.php $tempArray = explode("/",mime_content_type(file)); if ($temp[0] == "image") { showImage }
      • @Sandeep Manne, mime_content_type() 已弃用。此外,那些通用的“获取 mime 类型”函数只检查文件的几个字节,例如“如果文件以 '1f8b' 开头,它可能是 gzip 文件”,这不足以检测损坏的文件。
      【解决方案6】:

      查看所有最新损坏文件的好方法是使用 cpanel“错误日志”,它会显示所有最近 300 个损坏文件。

      【讨论】:

        猜你喜欢
        • 2012-04-13
        • 2011-03-30
        • 1970-01-01
        • 1970-01-01
        • 2020-03-13
        • 1970-01-01
        • 2020-01-12
        • 2011-04-10
        • 1970-01-01
        相关资源
        最近更新 更多