有啥方法可以让 PHP 检测到损坏的图像?

Posted

技术标签:

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

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

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

【问题讨论】:

损坏或丢失? 复制:***.com/questions/3677965/… PHP 不显示图像,浏览器 可以。也许您的意思是 PHP 将无法将其发送到浏览器... 是的,我的意思是损坏了,我应该更清楚。对不起。如果它已损坏,我需要 PHP 不将其发送到浏览器。 【参考方案1】:

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

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

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/***/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 个损坏文件。

【讨论】:

以上是关于有啥方法可以让 PHP 检测到损坏的图像?的主要内容,如果未能解决你的问题,请参考以下文章

使用OpenCV检测损坏的形状

尝试使用 PHP imgpng 将图像输出到浏览器时,我得到一个损坏的图像

电脑提示损坏的图像,没有被指定在Windows上运行,或者它包含错误。怎么解决?

Tensorflow 对象检测 API:TensorBoard 中损坏的训练图像

PHP:如何检查 gz 文件是不是损坏?

电脑提示损坏的图像,没有被指定在Windows上运行,或者它包含错误。怎么解决?