thinkphp5 上传图片 iPhone 设备 图片旋转问题处理

前台代码

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <title>test</title>
    </head>
    <body>
        <form action="/index/index/upfile" method="post" accept-charset="utf-8" enctype="multipart/form-data">
            
            <input type="file" name="up1" id="up1" value="" />
            
            <button type="submit">上传</button>
            
        </form>
    </body>
</html>

后台代码

   

    //获取文件类型 - 扩展名
    private function getType($filename){
        $temp_arr = explode(".", $filename);
        $file_ext = array_pop($temp_arr);
        $file_ext = trim($file_ext);
        $file_ext = strtolower($file_ext);
        return $file_ext;
    }
    
    //获取上传设备信息 - 如果非iphone,ipad苹果设备 返回 0 
    private function getFileVer($user_agent){
        $ua = strtolower($user_agent);
        if(strpos($ua,"iphone") || strpos($ua,"ipad") || strpos($ua,"ipod") || strpos($ua,"ios")){
            $verArr = explode('cpu iphone os',$ua);
            $verArr2 = explode('like mac os',$verArr[1]);
            $ver = trim($verArr2[0]);
            $ver = str_replace("_","",$ver);
            $ver = intval($ver);
            if(strlen($ver)<7) {
                $ver = $ver*pow(10,(7-strlen($ver)));
            }
            return $ver;
        }else{
            return 0;
        }
    }
    
    //图片格式转换
private function transform_image($image_path, $to_ext = 'png', $save_path = null)
{
    if (! in_array($to_ext, ['png', 'gif', 'jpeg', 'wbmp', 'webp', 'xbm'])) {
        throw new \Exception('unsupport transform image to ' . $to_ext);
    }
    switch (exif_imagetype($image_path)) {
        case IMAGETYPE_GIF :
            $img = imagecreatefromgif($image_path);
            break;
        case IMAGETYPE_JPEG :
        case IMAGETYPE_JPEG2000:
            $img = imagecreatefromjpeg($image_path);
            break;
        case IMAGETYPE_PNG:
            $img = imagecreatefrompng($image_path);
            break;
        case IMAGETYPE_BMP:
        case IMAGETYPE_WBMP:
            $img = imagecreatefromwbmp($image_path);
            break;
        case IMAGETYPE_XBM:
            $img = imagecreatefromxbm($image_path);
            break;
        case IMAGETYPE_WEBP: //(从 PHP 7.1.0 开始支持)
            $img = imagecreatefromwebp($image_path);
            break;
        default :
            throw new \Exception('Invalid image type');
    }
    $function = 'image'.$to_ext;
    if ($save_path) {
        return $function($img, $save_path);
    } else {
        $tmp = __DIR__.'/'.uniqid().'.'.$to_ext;
        if ($function($img, $tmp)) {
            $content = file_get_contents($tmp);
            unlink($tmp);
            return $content;
        } else {
            unlink($tmp);
            throw new \Exception('the file '.$tmp.' can not write');
        }
    }
}
    
 /**
 * 解决iPhone图片旋转问题
 * $src 图片绝对路径
 * $ver 手机版本号
 * **/
private function rotateImage($filename,$ver){
    $type = $this->getType($filename);
    if($type == 'png' || $type == 'PNG') {
        $this->transform_image($filename,'jpeg',$filename);
    }
    $exif = exif_read_data($filename);
    if(!empty($exif['Orientation']) && $ver>0) {
        $orientation = $exif['Orientation'];
        if($exif['MimeType'] == 'image/gif'){
            $image = imagecreatefromgif($filename);
        }else if($exif['MimeType'] == 'image/png'){
            $image = imagecreatefrompng($filename);
        }else{
            $image = imagecreatefromjpeg($filename);
        }
        if($ver > 1350000) {
            switch ($orientation) {
                case 8;
                    $image = imagerotate($image, 270, 0);
                    break;
                case 3:
                    $image = imagerotate($image, 0, 0);
                    break;
                case 6:
                    $image = imagerotate($image, 0, 0);
                    break;
            }
        }else if($ver >= 1350000 && $ver <1400000){
            switch ($orientation) {
                case 8;
                    $image = imagerotate($image, 0, 0);
                    break;
                case 3:
                    $image = imagerotate($image, 0, 0);
                    break;
                case 6:
                    $image = imagerotate($image, 0, 0);
                    break;
                case 1:
                    $image = imagerotate($image, 0, 0);
                    break;
            }
        }else{
            switch ($orientation) {
                case 8:
                    $image = imagerotate($image, 90, 0);
                    break;
                case 3:
                    $image = imagerotate($image, 180, 0);
                    break;
                case 6:
                    $image = imagerotate($image, -90, 0);
                    break;
            }
        }

        if($exif['MimeType'] == 'image/gif'){
            imagegif($image,$filename);
        }else if($exif['MimeType'] == 'image/png'){
            imagepng($image,$filename);
        }else{
            imagejpeg($image,$filename);
        }
        imagedestroy($image);
    }
}