手动检查 php 中的 jpeg 文件末尾标记 ffd9 (?) 以捕获截断错误

Posted

技术标签:

【中文标题】手动检查 php 中的 jpeg 文件末尾标记 ffd9 (?) 以捕获截断错误【英文标题】:check manually for jpeg end of file marker ffd9 (?) in php to catch truncation errors 【发布时间】:2009-09-22 12:47:44 【问题描述】:

基本上试图从集合中删除损坏的、过早结束的 jpeg 文件。我想如果文件结尾标记不存在,那么这意味着图像被截断,因此我认为它对我的目的无效。 这是检查声音的方法吗?如果是这样,我可以如何在 php 中实现它的任何想法?

干杯

【问题讨论】:

【参考方案1】:

试试这个:

$jpgdata = file_get_contents('image.jpg');

if (substr($jpgdata,-2)!="\xFF\xD9") 
  echo 'Bad file';

这会将整个 JPG 文件加载到内存中,并可能导致大文件出错。

替代方案:

$jpgdata = fopen('image.jpg', 'r'); // 'r' is for reading
fseek($jpgdata, -2, SEEK_END); // move to EOF -2
$eofdata = fread($jpgdata, 2);
fclose($jpgdata);

if ($eofdata!="\xFF\xD9") echo 'Bad file';

【讨论】:

某些 JPEG 文件在 EOF 标记之后有附加数据。我的一个后面有<space><linefeed>。所以这个检查可能有误报。【参考方案2】:

我通过 try catch 和函数前面的 @ 解决了这个问题:

    try
    
        if (!@imagecreatefromjpeg($photoPath)
            throw new Exception('The image is corrupted!');
    
    catch(Exception $e)
    
        $error = $e->getMessage();
        Yii::app()->user->setFlash('addphoto', Yii::t('app', $error));
    

【讨论】:

以上是关于手动检查 php 中的 jpeg 文件末尾标记 ffd9 (?) 以捕获截断错误的主要内容,如果未能解决你的问题,请参考以下文章

避免未找到JPEG标记!&“错误”

PHP:如何正确检查文件的 MIME 类型?

从磁盘转储中提取 jpeg

PHP-GD 如何使用 facebook 的 url 检查类型(jpeg、gif ..)?

php基础语法

使用 PHP 中的 GD 库将位图文件转换为 JPEG