PHP +图像类型检测

时间:2014-07-14 10:39:06

标签: php file mime-types

我有一个电子邮件脚本,可以从服务器发送文件槽附件。电子邮件是使用phpmailer发送的,附件的文件附在如下代码中:

$_img = (object) ($img);
if (!empty($_img->src)) {
    $ext = substr($_img->src, -3); 

    $imginfo_array = getimagesize($_img->src);
    $mime_type = $imginfo_array['mime'];                    

    switch($mime_type) {
        case "image/jpeg":
            $type = "image/jpeg";
            break;
        case "image/png":
            $type = "image/png";
            break;
        case "image/gif":
            $type = "image/gif";
            break;                                  
    }
    $string = file_get_contents($_img->src); 
    $mail->AddStringAttachment($string, $i . '.' . $ext, 'base64', $type);
}

在将图像添加到服务器之前未正确保存图像时会出现问题。如果一个用户确定文件'test.jpg'应为'test.png',则附件不会通过电子邮件显示。

$_img->src是保存在服务器上的文件。

我正在尝试检查mime类型但仍然没有成功。 我希望能够告诉脚本正确的文件类型是自动检测到的不是由扩展名确定的文件类型。 有人能给我一个关于如何做到这一点的线索吗?

2 个答案:

答案 0 :(得分:0)

        $_img = (object) ($img);
        if (!empty($_img->src)) {

            //$ext = substr($_img->src, -3);
            // better solution for get file extension (with variable length: "jpeg" or "jpeg")
            $ext = pathinfo($_img->src, PATHINFO_EXTENSION); 

            $imginfo_array = getimagesize($_img->src);
            $mime_type = $imginfo_array['mime'];                    

            switch($mime_type) {
                case "image/jpeg":
                    $type = "image/jpeg";
                    $ext = 'jpg';
                    break;
                case "image/png":
                  $type = "image/png";
                  $ext = 'png';
                  break;
               case "image/gif":
                  $type = "image/gif";
                  $ext = 'gif';
                  break;
               // fix for others mime type        
               default:    
                  $type = "application/octet-stream";

            }               

            // for binary file use AddAttachment()
            //$string = file_get_contents($_img->src);                 
            //$mail->AddStringAttachment($string, $i . '.' . $ext, 'base64', $type);

            // I hope that the variable $i is set from previous code              
            $mail->AddAttachment($_img->src, $i . '.' . $ext, 'base64', $type)
        }

答案 1 :(得分:0)

您可以在返回的imginfo_array的索引2处检测具有IMAGETYPE_XXX常量的图像类型。您使用的返回的mime字段不太可靠。

参见文档:

http://php.net/manual/en/function.getimagesize.php

类型含量:

http://php.net/manual/en/image.constants.php