如何在上传后检测被破坏或崩溃的图像

时间:2012-07-07 09:41:24

标签: php file-upload upload image-uploading uploading

上传后如何检测损坏的图像?

我正在使用这样的代码:

$imageSize = getimagesize($tmp_name);
if(!$imageSize ||  !in_array($imageSize['mime'], $allowMimeType)){
    $this->error = 'Bad Image';
    @unlink($tmp_name);
    return false;
}
$tn = imagecreatetruecolor(80, 80);
switch ($imageSize['mime']){
    case 'image/jpeg':
        $userphoto = imagecreatefromjpeg($tmp_name);// Error 1
    break;
    case 'image/png':
        $userphoto = imagecreatefrompng($tmp_name);// Error 1
    break;
    case 'image/gif':
        $userphoto = imagecreatefromgif($tmp_name);// Error 1
    break;
    case 'image/bmp':
        $userphoto = imagecreatefromwbmp($tmp_name);// Error 1
    break;
    default:
        $this->error = 'unknown image';
        @unlink($tmp_name);
        return false;
    break;
}
imagecopyresampled($tn, $userphoto, 0, 0, 0, 0, 80, 80, $width, $height);// Error 2
imagejpeg($tn,'images/userphoto/'.$this->username.'.jpg',100);
chmod('images/userphoto/'.$this->username.'.jpg', 0777);
@unlink($tmp_name);
USERPROFILE::updatePhotoByUsersId($this->username.'.jpg', $this->users_id);

但有时候我会给出2个错误串联,

  1. 在包含评论// Error 1
  2. 的行
      

    imagecreatefromwbmp()[href ='function.imagecreatefromwbmp'> function.imagecreatefromwbmp]:>'images / userphoto / 4ff7db9800871.bmp'不是有效的WBMP文件

         

    imagecreatefromgif()[href ='function.imagecreatefromgif'> function.imagecreatefromgif]:>'images / usersphoto / 4fe70bb390758'不是有效的GIF文件

    1. 在评论// Error 2

      的评论栏中
        

      imagecopyresampled():提供的参数不是有效的图像资源

    2.      我认为这是因为文件在上传过程中已损坏。如果我是对的,我怎么能解决这个问题?如果没有,原因是什么?

1 个答案:

答案 0 :(得分:2)

在进行任何进一步处理之前,您应该检查getimagesize()的返回值。

如果getimagesize()返回FALSE,则意味着它已失败且文件出现问题,因此您应该终止。图像通过此检查后,您可以继续处理。

至于你获得supplied argument is not a valid Image resource的原因,解释很简单:很可能,$userphoto中存储的图片实际上是FALSE,因为imagecreatefrompng()和其他{{1}函数失败,返回imagecreatefrom

解决方案:在继续之前,检查上传的图片是否对FALSE有效。

上传失败原因的一些可能原因:

  • 将图像写入临时目录时会损坏图像。
  • 用户正在上传损坏的文件。

关于getimagesize()失败,这是因为gd不支持BMP文件。您需要将BMP转换为gd可以使用的格式。例如,您可以使用bmp2png