类设计 - 图像上传 - 调整大小(无裁剪)

时间:2011-09-20 00:23:46

标签: php class

以下是编辑过的课程,其中包括答案:

编辑:包含的答案

<?php

class Upload
{
    private $originalWidth, 
            $originalHeight, 
            $newWidth, 
            $newHeight, 
            $maxMedium = 50, 
            $maxSmall = 20;

    private $src = NULL;

    private 
            $fileType,
            $fileName,
            $sessionId,
            $path_medium,
            $path_small;

    function __construct($fileType, $fileName)
    {
        if(1)
        {
            Session::start();
            Session::activate(0, 1000, 'Test Account A', 'bookmarks');
        }

        /**
         *    Initialize the Object
         */

        $this->sessionId = Session::get('id');
        $this->path_medium = PICTURES . "/$this->sessionId.jpg";
        $this->path_small = PICTURES . "/$this->sessionId-1.jpg";
        $this->fileType = $fileType;
        $this->fileName = $fileName;

        /**
         *    Instantiate the Object
         */

        $this->instantiate();
    }

    private function instantiate()
    {
        $this->createImages();
        $this->updateSessionAndDb();
    }

    private function createImages()
    {
        if(move_uploaded_file($this->fileName, $this->path_medium))
        {
            if($this->get_image($this->path_medium))
            {
                list($this->originalWidth,$this->originalHeight)=getimagesize($this->path_medium);
                $this->newWidth = $this->originalWidth;
                $this->newHeight = $this->originalHeight;
                // these could each be another class instead of two functions..but no time to refactor further
                $this->resize_move($this->maxMedium,$this->path_medium);
                $this->resize_move($this->maxSmall,$this->path_small);
                imagedestroy($this->src);
            }
        }
    }
    private function updateSessionAndDb()
    {
        $db = new Database();
        $result = $db->_pdoQuery('none', 'update_picture', array($this->sessionId));
        Session::set('picture',1);
    }
    private function resize_move($max, $path)
    {
        $this->makeProportions($max);
        $image_true_color = imagecreatetruecolor($this->newWidth, $this->newHeight);
        imagecopyresampled($image_true_color, $this->src, 0, 0, 0, 0, $this->newWidth, $this->newHeight, $this->
        originalWidth, $this->originalHeight);
        imagejpeg($image_true_color, $path);
        imagedestroy($image_true_color);
    }
    private function makeProportions($max)
    {
        $this->newWidth=$this->originalWidth; 
        $this->newHeight=$this->originalHeight;
        if(($this->originalWidth > $this->originalHeight) && ($this->originalWidth > $max))
        {
            $this->newWidth = $max;
            $this->newHeight = ($max / $this->originalWidth) * $this->originalHeight;
        }
        elseif($this->originalHeight > $this->originalWidth && $this->originalHeight > $max)
        {
            $this->newHeight = $max;
            $this->newWidth = ($max / $this->originalHeight) * $this->originalWidth;
        } 
        elseif ($this->originalWidth > $max)
        {
            $this->newWidth = $this->newHeight = $max;
        }
    }
    private function get_image($path)
    {
        $type_creators = array( 
            'image/gif' => 'imagecreatefromgif', 
            'image/pjpeg' => 'imagecreatefromjpeg', 
            'image/jpeg' => 'imagecreatefromjpeg', 
            'image/png' => 'imagecreatefrompng'); 
        if(array_key_exists($this->fileType, $type_creators)) 
        { 
            $this->src = $type_creators[$this->fileType]($path); 
            return true; 
        }
    return false; 
    }
}

1 个答案:

答案 0 :(得分:3)

我注意到的一些事情:

  • 您的方法和变量名称应该更清晰。具体来说,rmove应该重命名为更具描述性的内容,以及每个私有成员变量。使用函数和变量名称进行清晰而不是简洁的拍摄。

  • 从您的类中删除对$ _FILES和$ _SESSION的引用,并将该信息传递给构造函数。没有必要将此类与周围客户端代码的实现细节相结合。您可能希望在电子邮件不在会话变量中的其他情况下重用它,或者文件信息不在$ _FILES中。

  • 您可以按如下方式重写get_image()方法,使其更清晰,更短。请注意,使用此方法,添加对新图像类型的支持只需在方法开始时将它们添加到数组中。您甚至可以将该数组移出该方法并将其作为静态成员变量提供。

    function get_image($path)
    {
    $type_creators = array(
        'image/gif' => 'imagecreatefromgif',
        'image/jpeg' => 'imagecreatefromjpeg',
        'image/png' => 'imagecreatefrompng',
    );
    
    $img_type = $_FILES['ufile']['type'];
    
    if (array_key_exists($img_type, $type_creators)) {
        $this->src = $type_creators[$img_type]($path);
        return true;
    }
    return false;
    }
    
  • 不要将成员变量作为参数传递给方法。请记住,它们已经自动可用。因此,而不是$this->rmove($this->max1,$path3);,只需从$this->max1内访问rmove

  • 考虑将rmove分解为较小的私有函数,其名称清楚地描述了if语句的每种情况。

  • 此外,rmove目前正在执行两项不同的操作:1)重新计算真实的宽度和高度,以及2)根据这些尺寸创建新版本的图像。我将其分解为两种方法,分别对这些任务进行处理。

  • 最后,需要考虑一个更大的问题:此类没有任何公共API。没有理由现在任何方法都需要公开,因为客户端代码永远不会使用它们。现在,该类只是作为容器代码来执行一系列应该在文件上载后触发的任务。因此,您应该考虑重新考虑客户端代码在其他情况下如何使用此类。