这是新的。无法从智能手机上传照片?

时间:2014-05-02 04:05:15

标签: php image mobile upload

所以我创建了一个响应式网站,可以选择将图像上传到页面。 php脚本基本上调整了图像的大小,并将拇指文件路径存储在数据库中。原始图像和拇指图像也存储在网站文件夹中。我正在使用GD库。

无论如何,我只是在测试从iphone上传照片到网站。它确实上传了图像。但是它有两个问题。

  1. 上传照片需要太长时间。
  2. 完成上传后,照片会侧向定向。如果照片是肖像照片,则会将其上传为横向照片。怪异。
  3. 任何人都可以帮我解决这两个问题吗?

    更新代码

    if (isset($_FILES['image'])) {
    
        if (empty($_FILES['image']['name'])) {
    
                ?><div class="add-errors">Please choose an image!</div><?php 
    
        }   else {
    
    
            function getOrientedImage($imagePath){
                $image = imagecreatefromstring(file_get_contents($imagePath));
                $exif = exif_read_data($imagePath);
                if(!empty($exif['Orientation'])) {
                    switch($exif['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;
                    }
                }
                return $image;
            }
    
            $name       =   $_FILES['image']['name'];
            $temp       =   $_FILES['image']['tmp_name'];
            $type       =   $_FILES['image']['type'];
            $size       =   $_FILES['image']['size'];
            $ext        =   strtolower(end(explode('.', $name)));
            $size2      =   getimagesize($temp);
            $width      =   $size2[0];
            $height     =   $size2[1];
            $upload     =   md5( rand( 0, 1000 ) . rand( 0, 1000 ) . rand( 0, 1000 ) . rand( 0, 1000 ));
    
            // Restrictions for uploading
            $maxwidth   =   6000;
            $maxheight  =   6000;
            $allowed    =   array('image/jpeg', 'image/jpg', 'image/png', 'image/gif');
    
            // Recognizing the extension
            switch($type){
    
                // Image/Jpeg
                case 'image/jpeg':
                        $ext= '.jpeg';
                break;
    
                // Image/Jpg
                case 'image/jpg':
                        $ext= '.jpg';
                break;
    
                // Image/png
                case 'image/png':
                        $ext= '.png';
                break;
    
                // Image/gif
                case 'image/gif':
                        $ext= '.gif';
                break;
            }
    
            // upload variables
            $path           =   $userDir . $upload . $ext;
            $thumb_path     =   $userDir . 'thumb_' . $upload . $ext;
    
            // check if extension is allowed.
            if (in_array($type, $allowed)) {
    
                // Checking if the resolution is FULLHD or under this resolution.
                if ($width <= $maxwidth && $height <= $maxheight) {
                    if ($size <= 5242880) {
    
                        // check the shape of the image
                        if ($width == $height) {$shape = 1;}
                        if ($width > $height) {$shape = 2;}
                        if ($width < $height) {$shape = 2;}
    
                        //Adjusting the resize script on shape.
                        switch($shape) {
    
                            // Code to resize a square image.
                            case 1:
                                $newwidth =     690;
                                $newheight =    690;
                            break;
    
                            // Code to resize a tall image
                            case 2:
                                $newwidth   =   690;
                                $ratio      =   $newwidth / $width;
                                $newheight  =   round($height * $ratio);
    
                            break;
    
                        }
    
                        // Resizing according to extension.
                        switch ($type) {
    
                            // Image/Jpeg   
                            case 'image/jpeg';
                                $img =      getOrientedImage($temp);
                                $thumb =    imagecreatetruecolor($newwidth, $newheight);
                                            imagecopyresized($thumb, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
                                            imagejpeg($thumb, $thumb_path);
                            break;
    
                            // Image/Jpg    
                            case 'image/jpg';
                                $img =      getOrientedImage($temp);
                                $thumb =    imagecreatetruecolor($newwidth, $newheight);
                                            imagecopyresized($thumb, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
                                            imagejpeg($thumb, $thumb_path);
                            break;
    
                            // Image/png    
                            case 'image/png';
                                $img =      getOrientedImage($temp);
                                $thumb =    imagecreatetruecolor($newwidth, $newheight);
                                            imagecopyresized($thumb, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
                                            imagepng($thumb, $thumb_path);
                            break;
    
                            // Image/gif    
                            case 'image/gif';
                                $img =      getOrientedImage($temp);
                                $thumb =    imagecreatetruecolor($newwidth, $newheight);
                                            imagecopyresized($thumb, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
                                            imagegif($thumb, $thumb_path);
                            break;
                        }
    
    
                            // Move the original file aswell.
                            move_uploaded_file($temp, $path);
    
    
                    } else {
                        ?><div class="add-errors">Your image size is too big!</div><?php
                    }
                } else {
                    ?><div class="add-errors">Your image resolution exceeds the limit!</div><?php
                }
    
            } else {
                ?><div class="add-errors">Your have uploaded a forbidden extension!</div><?php
    
            }
    
        }
    
    }
    

2 个答案:

答案 0 :(得分:4)

您可能希望查看exif_read_data()函数,并查看数组中返回的['Orientation']值。通常,具有方向传感器的电话或相机以一个方向或另一个方向存储图像,然后将适当的方向标记添加到图片中的exif数据。然后由图像查看器或图像处理器决定在显示或处理图像之前是否旋转原始图片。

该页面的评论中有一些很好的例子。

根据该页面上的一个示例构建的功能:

<?php
    function getOrientedImage($imagePath){
        $image = imagecreatefromstring(file_get_contents($imagePath));
        $exif = exif_read_data($imagePath);
        if(!empty($exif['Orientation'])) {
            switch($exif['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;
            }
        }
        return $image;
    }
?>

此外,关于上传时间,如果设备使用手机信号塔传输数据,您的上传速度可能只是下载速度的一小部分。为了比较,大多数社交网络应用程序在上传之前调整图像大小,而您的网页可能不会。由于手机需要800万像素或更高的照片,因此会增加大量数据。

答案 1 :(得分:0)

1)不确定您是否可以做任何事情,您上传用户选择的图像。在应用程序中,我可能会在传输之前缩小图像尺寸。

2)无论您正在查看照片(或生成缩略图),都可能不尊重照片中的方向标记。