RSS
 

Загрузка изображений на сервер

15 Янв


Очень часто разработчикам приходится сталкиваться с задачей, загрузки изображений на сервер. И под рукой должный быть, всегда, надежные инструменты.
Хочу представить один из таких классов.
Очень удобный и быстрый класс для безопасной загрузки изображения на сервер.

файл класса: gallery.class.php

  1. <?php
  2.  
  3. Class Gallery {
  4.  
  5.     // Путь для хранения
  6.     var $imgDir = './img/';
  7.  
  8.     var $thumbDir = './img/thumb/';
  9.  
  10.     // Размер маленьких изображений
  11.     var $imgWidth = 130;
  12.     var $imgHeight = 120;
  13.  
  14.     //Размер большого изображения
  15.     var $imgWidthB = 320;
  16.     var $imgHeightB = 300;
  17.  
  18.     var $imgName = '';
  19.  
  20.     var $msg = array();
  21.  
  22.     // Разрешенные форматы изображений
  23.     var $exts = array(1 => 'gif',
  24.                       2 => 'jpg',
  25.                       3 => 'png');
  26.  
  27.     var $extList = array('image/gif', 'image/jpeg', 'image/png');
  28.  
  29.  
  30.     function __construct() {
  31.         if(!is_dir($this->imgDir) || !is_dir($this->tmpDir)) {
  32.             $msg[] = 'Указаной директории не существует!';
  33.         }
  34.     }
  35.  
  36.     // Проверка изображения
  37.     private function checkImg($img) {
  38.         if(!is_file($img['tmp_name'])) die('3');
  39.  
  40.         $data = getimagesize($img['tmp_name']);
  41.         $filesize = filesize($img['tmp_name']);
  42.         $format = explode('.',$img['name']);
  43.  
  44.         if(!in_array($format[count($format)-1], $this->exts)) die('4');
  45.         if($filesize ==  0) die('6');
  46.         if($data[ 0] != $this->imgWidthB || $data[1] != $this->imgHeightB) die('5');
  47.         if(!isset($this->exts[$data[2]])) die('8');
  48.         if(!in_array($img['type'], $this->extList) || !in_array($data['mime'], $this->extList)) die('7');
  49.  
  50.         $result = array('width' => $data[ 0],
  51.                         'height' => $data[1],
  52.                         'extension' => $this->exts[$data[2]],
  53.                         'size' => $filesize);
  54.  
  55.         return $result;
  56.     }
  57.  
  58.     public function loadImg($img) {
  59.  
  60.         $data = $this->checkImg($img);
  61.  
  62.         if(!is_array($data)) die('1');
  63.  
  64.         $this->imgName = $this->imgNewName($data['extension']);
  65.         if(!move_uploaded_file($img['tmp_name'], $this->imgDir.$this->imgName)) die('2');
  66.  
  67.         $this->creatThumb($data['extension'], $this->imgName);
  68.  
  69.         return $this->imgName;
  70.     }
  71.  
  72.     private function creatThumb($type, $name) {
  73.  
  74.         switch($type) {
  75.             case 'gif':
  76.             $src_img = imagecreatefromgif($this->imgDir.$name);
  77.             break;
  78.  
  79.             case 'jpg':
  80.             $src_img = imagecreatefromjpeg($this->imgDir.$name);
  81.             break;
  82.  
  83.             case 'png':
  84.             $src_img = imagecreatefrompng($this->imgDir.$name);
  85.             break;
  86.         }
  87.  
  88.         $old_w = imagesx($src_img);
  89.         $old_h = imagesy($src_img);
  90.  
  91.         $ratio1 = $old_w/$this->imgWidth;
  92.         $ratio2 = $old_h/$this->imgHeight;
  93.  
  94.         if($ratio1>$ratio2) {
  95.             $thumb_w=$this->imgWidth;
  96.             $thumb_h=$old_h/$ratio1;
  97.         }
  98.         else {
  99.             $thumb_h=$this->imgHeight;
  100.             $thumb_w=$old_w/$ratio2;
  101.         }
  102.  
  103.         $im = imagecreatetruecolor($thumb_w, $thumb_h);
  104.         imagecopyresampled($im,$src_img, 0, 0, 0, 0,$thumb_w,$thumb_h,$old_w,$old_h)
  105. ;
  106.  
  107.         switch($type) {
  108.             case 'gif':
  109.             imagegif($im, $this->thumbDir.$name);
  110.             break;
  111.  
  112.             case 'jpg':
  113.             imagejpeg($im, $this->thumbDir.$name);
  114.             break;
  115.  
  116.             case 'png':
  117.             imagepng($im, $this->thumbDir.$name);
  118.             break;
  119.         }
  120.     }
  121.  
  122.     // Метод для генерации названий
  123.     private function imgNewName($type) {
  124.         $imgName = mt_rand(0000,9999).'_'.mt_rand(00,99).'.'.$type;
  125.  
  126.         if(file_exists($this->imgDir.$imgName)) {
  127.             $imgName = $this->imgNewName();
  128.         }
  129.  
  130.         return $imgName;
  131.     }
  132.  
  133. }
  134. ?>



теперь применим класс в действии: index.php

  1. <?php
  2. require_once('./gallery.class.php');
  3.  
  4. $img = new Gallery();
  5.  
  6. if(isset($_FILES['file'])) {
  7.     if($img->loadImg($_FILES['file'])) {
  8.         echo 'ok';
  9.     }
  10.     else echo 'error';
  11. }
  12. ?>
  13. <form enctype="multipart/form-data" method="post" action="">
  14.   <input type="file" name="file" />
  15.   <input type="submit" name="Submit" value="Submit" />
  16. </form>

Буду рад, вашим отзывам…

 
4 Comments

Posted in PHP

 

Теги: , ,

Если понравился пост, то подпишитесь на новые!

Введите свой E-mail:

Оставить комментарий

 
 
  1. Rus

    25.02.2010 at 13:20

    Привет, ошибки в основном вылезают под номерами: 2,5,4.
    Это с чем связано?

     
  2. fuzaylov

    25.02.2010 at 14:47

    Ошибка №1 – Переданные данные(изображение) не корректны!
    Ошибка №2 – Ошибка записи изображения на сервер
    Ошибка №3 – Ошибка записи изображения на сервер
    Ошибка №4 – Формат изображения не соответствует прописным в параметрах
    Ошибка №5 – Размер изображения не соответствует прописным в параметрах
    Ошибка №6 – Файл не является изображением
    Ошибка №7 – Файл не является изображением
    Ошибка №8 – Формат изображения не соответствует прописным в параметрах

     
  3. linex

    25.02.2010 at 15:48

    А как можно сделать удаленную загрузку фоток?

     
  4. fuzaylov

    25.02.2010 at 16:18

    Можно попробовать с помощью Curl