<?php
/**
* ÐлаÑÑ FileUploader.
*
* @package energine
* @subpackage core
* @author 1m.dm
* @copyright ColoCall 2006
* @version $Id: FileUploader.class.php,v 1.9 2007/12/17 14:16:03 pavka Exp $
*/
//require_once('core/framework/Object.class.php');
/**
* ÐагÑÑзÑик Ñайлов на ÑеÑвеÑ.
*
* @package energine
* @subpackage core
*/
class FileUploader extends Object {
/**
* @access private
* @var array опиÑание загÑÑжаемого Ñайла
* @see PHP manual, POST method uploads
*/
private $file = array();
/**
* @access private
* @var array огÑаниÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð³ÑÑжаемого Ñайла
*/
private $restrictions = array();
/**
* @access private
* @var string ÑаÑÑиÑение Ñайла
*/
private $ext;
/**
* @access private
* @var string имÑ, под коÑоÑÑм загÑÑженнÑй Ñайл ÑоÑ
Ñанен на ÑеÑвеÑе
*/
private $FileObjectName;
/**
* @access private
* @var string пÑÑÑ Ðº коÑÐ½ÐµÐ²Ð¾Ð¼Ñ ÐºÐ°ÑÐ°Ð»Ð¾Ð³Ñ Ð·Ð°Ð³ÑÑжаемÑÑ
Ñайлов
*/
private $uploadsPath = '';
/**
* @access private
* @var boolean Ñлаг, ÑказÑваÑÑий бÑла ли пÑоизведена валидаÑÐ¸Ñ (пÑовеÑÑеÑÑÑ Ð¼ÐµÑодом upload)
*/
private $validated = false;
////////////////////////////////////////////////////////////////////////////
/**
* ÐонÑÑÑÑкÑÐ¾Ñ ÐºÐ»Ð°ÑÑа.
*
* @access public
* @return void
*/
public function __construct() {
parent::__construct();
$this->restrictions = array(
'width' => false,
'height' => false,
'precision' => false,
'max' => false
);
}
/**
* УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ ÐºÐ¾ÑоÑÑм должен ÑооÑвеÑÑÑвоваÑÑ Ð·Ð°Ð³ÑÑжаемÑй
*
* ÐÐ»Ñ Ð¸Ð·Ð¾Ð±Ñажений:
* array(
* 'width' => integer, // ÑиÑина иÑобÑажениÑ
* 'height' => integer, // вÑÑоÑа изобÑажениÑ
* 'precise' => boolean // true - ÑоÑнÑй ÑазмеÑ, false - не более Ñказанного (по-ÑмолÑаниÑ),
* 'max' => integer //макÑималÑнÑй ÑÐ°Ð·Ð¼ÐµÑ Ñайла
* )
*
* @access public
* @param array $restrictions
* @return void
*/
public function setRestrictions(array $restrictions) {
$this->restrictions = $restrictions;
}
/**
* УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¾Ð¿Ð¸Ñание Ñайла.
*
* @access public
* @param array $file
* @return void
*/
public function setFile(array $file) {
if (!isset($file['name'], $file['size'], $file['tmp_name'], $file['error'])) {
throw new SystemException('ERR_DEV_BAD_DATA', SystemException::ERR_DEVELOPER, $file);
}
$this->file = $file;
}
/**
* ÐалидаÑÐ¸Ñ Ð·Ð°Ð³ÑÑжаемого Ñайла.
*
* @access public
* @return boolean
*/
public function validate() {
/*
* ÐÑаÑÐ·ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ поÑÑлаÑÑ MIME type, поÑÑÐ¾Ð¼Ñ ÑаÑÑиÑÑваÑÑ Ð½Ð° него нелÑзÑ.
*/
if (empty($this->file)) {
throw new SystemException('ERR_DEV_BAD_DATA', SystemException::ERR_DEVELOPER, $this->file);
}
if ($this->file['error'] != UPLOAD_ERR_OK || !is_uploaded_file($this->file['tmp_name'])) {
throw new SystemException('ERR_UPLOAD_FAILED', SystemException::ERR_WARNING, $this->file['error']);
}
$this->ext = strtolower(substr(strrchr($this->file['name'], '.'), 1));
/*
$size = @getimagesize($this->file['tmp_name']);
if (!$size) {
throw new SystemException('ERR_INVALID_IMAGE', SystemException::ERR_WARNING, $this->file['tmp_name']);
}
if (isset($this->restrictions['width']) &&
(($this->restrictions['precise'] && $size[0] != $this->restrictions['width']) ||
$size[0] > $this->restrictions['width'])) {
throw new SystemException('ERR_BAD_IMAGE_WIDTH', SystemException::ERR_WARNING, $size[0]);
}
if (isset($this->restrictions['height']) &&
(($this->restrictions['precise'] && $size[1] != $this->restrictions['height']) ||
$size[1] > $this->restrictions['height'])) {
throw new SystemException('ERR_BAD_IMAGE_HEIGHT', SystemException::ERR_WARNING, $size[1]);
}
if ($this->file['size'] > $this->maxsize) {
throw new SystemException('ERR_UPLOADED_FILE_EXCEEDS_SIZE_LIMIT', SystemException::ERR_WARNING, $this->file['size']);
}
*/
return ($this->validated = true);
}
/**
* ФакÑиÑеÑÐºÐ°Ñ Ð·Ð°Ð³ÑÑзка Ñайла в опÑеделеннÑÑ Ð´Ð¸ÑекÑоÑиÑ.
*
* @access public
* @param string $dir диÑекÑоÑÐ¸Ñ Ð²Ð½ÑÑÑи коÑневого каÑалога загÑÑжаемÑÑ
Ñайлов
* @return boolean
*/
public function upload($dir) {
if (!$this->validated) {
$this->validate();
}
if ($dir[0] == '/') {
$dir = substr($dir, 1);
}
if ($dir[strlen($dir)-1] != '/') {
$dir .= '/';
}
/*
* ÐенеÑиÑÑем ÑникалÑное Ð¸Ð¼Ñ Ñайла.
*/
$c = ''; // пеÑвÑй ваÑÐ¸Ð°Ð½Ñ Ð¸Ð¼ÐµÐ½Ð¸ не бÑÐ´ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ñимвол '0'
do {
$filename = time()."$c.{$this->ext}";
$c++; // пÑи пеÑвом пÑоÑ
оде Ñикла $c пÑиводиÑÑÑ Ðº integer(1)
} while(file_exists($this->uploadsPath.$dir.$filename));
if (!@move_uploaded_file($this->file['tmp_name'], $this->uploadsPath.$dir.$filename)) {
throw new SystemException('ERR_DEV_UPLOAD_FAILED', SystemException::ERR_WARNING, $this->file);
}
$this->FileObjectName = $this->uploadsPath.$dir.$filename;
chmod($this->FileObjectName, 0644);
return true;
}
/**
* ÐозвÑаÑÐ°ÐµÑ Ð¸Ð¼Ñ Ð·Ð°Ð³ÑÑженного Ñайла.
*
* @access public
* @return string
*/
public function getFileObjectName() {
return $this->FileObjectName;
}
/**
* ÐозвÑаÑÐ°ÐµÑ ÑаÑÑиÑение Ñайла.
*
* @access public
* @return string
*/
public function getExtension() {
return $this->ext;
}
/**
* ÐÑиÑÐ°ÐµÑ ÑоÑÑоÑние обÑекÑа Ð´Ð»Ñ Ð¿Ð¾Ð²ÑоÑного иÑполÑзованиÑ.
*
* @access public
* @return void
*/
public function cleanUp() {
$this->restrictions = array();
$this->ext = null;
$this->FileObjectName = null;
$this->validated = false;
}
}