Source for file FileUploader.class.php

Documentation is available at FileUploader.class.php

  1. /**
  2.  * Класс FileUploader.
  3.  *
  4.  * @package energine
  5.  * @subpackage core
  6.  * @author 1m.dm
  7.  * @copyright ColoCall 2006
  8.  * @version $Id: fsource_energine_core_frameworkFileUploader.class.php.html,v 1.1 2007/09/17 14:32:34 pavka Exp $
  9.  */
  10.  
  11. require_once 'core/framework/Object.class.php';
  12.  
  13. /**
  14.  * Загрузчик файлов на сервер.
  15.  *
  16.  * @package energine
  17.  * @subpackage core
  18.  */
  19. class FileUploader extends Object {
  20.  
  21.     /**
  22.      * @access private
  23.      * @var array описание загружаемого файла
  24.      * @see PHP manual, POST method uploads
  25.      */
  26.     private $file = array();
  27.  
  28.     /**
  29.      * Mime Type
  30.      *
  31.      * @var string 
  32.      * @access private
  33.      */
  34.     private $type;
  35.  
  36.     /**
  37.      * @access private
  38.      * @var array ограничения для загружаемого файла
  39.      */
  40.     private $restrictions = array();
  41.  
  42.     /**
  43.      * @access private
  44.      * @var string расширение файла
  45.      */
  46.     private $ext;
  47.  
  48.     /**
  49.      * @access private
  50.      * @var string имя, под которым загруженный файл сохранен на сервере
  51.      */
  52.     private $FileObjectName;
  53.  
  54.     /**
  55.      * @access private
  56.      * @var string путь к корневому каталогу загружаемых файлов
  57.      */
  58.     private $uploadsPath = '';
  59.  
  60.     /**
  61.      * @access private
  62.      * @var boolean флаг, указывающий была ли произведена валидация (проверяется методом upload)
  63.      */
  64.     private $validated = false;
  65.  
  66.     ////////////////////////////////////////////////////////////////////////////
  67.  
  68.     /**
  69.      * Конструктор класса.
  70.      *
  71.      * @access public
  72.      * @return void 
  73.      */
  74.     public function __construct({
  75.         parent::__construct();
  76.         $this->restrictions = array(
  77.             'width' => false,
  78.             'height' => false,
  79.             'precision' => false,
  80.             'max' => false,
  81.             'type' => FileSystemObject::FOLDER_TYPE_FAMILY FileSystemObject::IMAGE_TYPE_FAMILY FileSystemObject::TXT_TYPE_FAMILY FileSystemObject::UNDEF_TYPE_FAMILY
  82.         );
  83.     }
  84.  
  85.     /**
  86.      * Устанавливает ограничения которым должен соответствовать загружаемый
  87.      *
  88.      * Для изображений:
  89.      *     array(
  90.      *         'width'   => integer, // ширина ищображения
  91.      *         'height'  => integer, // высота изображения
  92.      *         'precise' => boolean  // true - точный размер, false - не более указанного (по-умолчанию),
  93.      *         'max' => integer //максимальный размер файла
  94.      *         'type' =>
  95.      *     )
  96.      *
  97.      * @access public
  98.      * @param array $restrictions 
  99.      * @return void 
  100.      */
  101.     public function setRestrictions(array $restrictions{
  102.         $this->restrictions $restrictions;
  103.     }
  104.  
  105.     /**
  106. /**
  107.      * Устанавливает описание файла.
  108.      *
  109.      * @access public
  110.      * @param array $file 
  111.      * @return void 
  112.      */
  113.     public function setFile(array $file{
  114.         if (!isset($file['name']$file['type']$file['size']$file['tmp_name']$file['error'])) {
  115.             throw new SystemException('ERR_DEV_BAD_DATA'SystemException::ERR_DEVELOPER$file);
  116.         }
  117.         $this->type = FileSystemObject::getTypeInfo($file['tmp_name']);
  118.         $this->file = $file;
  119.     }
  120.  
  121.     /**
  122.      * Валидация загружаемого файла.
  123.      *
  124.      * @access public
  125.      * @return boolean 
  126.      */
  127.     public function validate({
  128.         /*
  129.          * Браузер может не посылать MIME type, поэтому расчитывать на него нельзя.
  130.          */
  131.         if (empty($this->file)) {
  132.             throw new SystemException('ERR_DEV_BAD_DATA'SystemException::ERR_DEVELOPER$this->file);
  133.         }
  134.  
  135.         if ($this->file['error'!= UPLOAD_ERR_OK || !is_uploaded_file($this->file['tmp_name'])) {
  136.             throw new SystemException('ERR_UPLOAD_FAILED'SystemException::ERR_WARNING$this->file['error']);
  137.         }
  138.  
  139.         $this->ext = strtolower(substr(strrchr($this->file['name']'.')1));
  140. /*
  141.  
  142.         $size = @getimagesize($this->file['tmp_name']);
  143.         if (!$size) {
  144.             throw new SystemException('ERR_INVALID_IMAGE', SystemException::ERR_WARNING, $this->file['tmp_name']);
  145.         }
  146.  
  147.         if (isset($this->restrictions['width']) &&
  148.             (($this->restrictions['precise'] && $size[0] != $this->restrictions['width']) ||
  149.             $size[0] > $this->restrictions['width'])) {
  150.             throw new SystemException('ERR_BAD_IMAGE_WIDTH', SystemException::ERR_WARNING, $size[0]);
  151.         }
  152.  
  153.         if (isset($this->restrictions['height']) &&
  154.             (($this->restrictions['precise'] && $size[1] != $this->restrictions['height']) ||
  155.             $size[1] > $this->restrictions['height'])) {
  156.             throw new SystemException('ERR_BAD_IMAGE_HEIGHT', SystemException::ERR_WARNING, $size[1]);
  157.         }
  158.  
  159.  
  160.         if ($this->file['size'] > $this->maxsize) {
  161.             throw new SystemException('ERR_UPLOADED_FILE_EXCEEDS_SIZE_LIMIT', SystemException::ERR_WARNING, $this->file['size']);
  162.         }
  163. */
  164.         return ($this->validated true);
  165.     }
  166.  
  167.     /**
  168.      * Фактическая загрузка файла в определенную директорию.
  169.      *
  170.      * @access public
  171.      * @param string $dir директория внутри корневого каталога загружаемых файлов
  172.      * @return boolean 
  173.      */
  174.     public function upload($dir{
  175.         if (!$this->validated{
  176.             $this->validate();
  177.         }
  178.  
  179.         if ($dir[0== '/'{
  180.             $dir = substr($dir1);
  181.         }
  182.         if ($dir[strlen($dir)-1!= '/'{
  183.             $dir .= '/';
  184.         }
  185.  
  186.         /*
  187.          * Генерируем уникальное имя файла.
  188.          */
  189.         $c ''// первый вариант имени не будет включать символ '0'
  190.         do {
  191.             $filename = time()."$c.{$this->ext}";
  192.             $c++// при первом проходе цикла $c приводится к integer(1)
  193.         while(file_exists($this->uploadsPath.$dir.$filename));
  194.  
  195.         if (!@move_uploaded_file($this->file['tmp_name']$this->uploadsPath.$dir.$filename)) {
  196.             throw new SystemException('ERR_DEV_UPLOAD_FAILED'SystemException::ERR_WARNING$this->file);
  197.         }
  198.         $this->FileObjectName $this->uploadsPath.$dir.$filename;
  199.         chmod($this->FileObjectName0644);
  200.  
  201.         return true;
  202.     }
  203.  
  204.     /**
  205.      * Возвращает имя загруженного файла.
  206.      *
  207.      * @access public
  208.      * @return string 
  209.      */
  210.     public function getFileObjectName({
  211.         return $this->FileObjectName;
  212.     }
  213.  
  214.     /**
  215.      * Возвращает расширение файла.
  216.      *
  217.      * @access public
  218.      * @return string 
  219.      */
  220.     public function getExtension({
  221.         return $this->ext;
  222.     }
  223.  
  224.     /**
  225.      * Очищает состояние объекта для повторного использования.
  226.      *
  227.      * @access public
  228.      * @return void 
  229.      */
  230.     public function cleanUp({
  231.         $this->restrictions array();
  232.         $this->ext null;
  233.         $this->FileObjectName null;
  234.         $this->validated false;
  235.     }
  236. }

Documentation generated on Mon, 17 Sep 2007 13:29:22 +0300 by phpDocumentor 1.4.0a2