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

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

干杯

【问题讨论】:

    标签: php jpeg corrupt


    【解决方案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));
        }
    

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 2021-10-19
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多