)))
Не судите строго ))
<?php
/**
*
* generateName - метод создания уникального имени
* checkFile - метод проверки на расширение
* insertQuery - метод добавления в БД
* stringFile - рисоуем надпись по верх картинки
* resizeFile - метод уменьшения фото
*
*/
class PAM_UploadFile
{
/**
* свойства по умолчанию
* @var array
*/
public $options = array(
'file_dir' => '',
'file_type' => array('JPG', 'jpeg', 'jpg', 'gif', 'png'),
'file_name' => 'file',
'maxWidth' => 1500,
'maxHeight' => 1100,
'minWidth' => 250,
'minHeight' => 250,
'font' => '', // адрес до текста
'file_text' => '',// текст по верх изображения
'table_name' => ''
);
/**
* свойство $result массив возвращается классом содержит адреса фото где они находятся
* и если необходимо содержит sql запрос insert
* @var array
*/
protected $result = array();
protected $file = '';
/**
* свойство $error
* в этом свойстве перечесляются все возможные ошибки
* @var array
*/
private $error = array('' => '');
function __construct($opt = array())
{
$this->options['font'] = (!empty($opt['font'])) ? $opt['font'] : $this->options['font'];
$this->options['file_text'] = (!empty($opt['file_text'])) ? $opt['file_text'] : $this->options['file_text'];
$this->options['file_dir'] = (!empty($opt['file_dir'])) ? $opt['file_dir'] : $this->options['file_dir'];
$this->options['file_name'] = (!empty($opt['file_name'])) ? $opt['file_name'] : $this->options['file_name'];
$this->options['table_name'] = (!empty($opt['table_name'])) ? $opt['table_name'] : $this->options['table_name'];
// присваиваем переменной $this->file массив $_FILES
$this->file = $_FILES[$this->options['file_name']];
}
/**
* function checkFile
* проверка типа файла если подходит то выводим тип иначе возвращаем фальш
* @param $file_name - string
* @return bool|mixed
*/
protected function checkFile($file_name)
{
// достаем тип файла
$extension = pathinfo($file_name, PATHINFO_EXTENSION);
// если не прошло проверку на соответствие с типом файла возвращаем false
return in_array($extension, $this->options['file_type']) ? $extension : false;
}
/**
* function generateName - формирует новое имя
* @param $file_name - string
* @return string
*/
protected function generateName($file_name)
{
$new_name = substr(md5($file_name), 0, 5) . '_' . time();
return $new_name;
}
/**
* function insertQuery
* метод составления запроса вставки в БД
* @param $key- номер файла в массве $file
* @param $table - char имя таблицы
* @param $file_url - полный адрес до папки с файлом включительно
* @return string - возвращает строку с адресом или набором адресов
*/
protected function insertQuery($key, $table, $file_url)
{
$insert = "INSERT INTO `" . $table . "` (`img`) VALUES ";
$result = '';
// если больше одного файла
if ($key > 0) {
$sql = ", ('" . $file_url . "')";
$result .= $sql;
} else {
$sql = "('" . $file_url . "')";
$result = $insert . $sql;
}
return $result;
}
/**
* function stringFile
* функция добавления строки по верх изображения
* @param $img - вновь созданное изображение
* @param $width_orig - ширина оригенала
* @param $height_orig - высота оригенала
* @param $string - строка которую нужно добавить
* @return array|bool - возвращается массив с изображением и строкой по верх либо false
*/
protected function stringFile($img, $width_orig, $height_orig, $string)
{
// цвет текста
$color = imagecolorallocatealpha($img, 255, 255, 255, 70);
// высота букв в %
if ($height_orig < $width_orig) {
$px = ($height_orig / 100) * 7;
} else {
$px = ($width_orig / 100) * 7;
}
// создаем рамку вокруг текста
$bbox = imageftbbox($px, 0, $this->options['font'], $string);
// наши координаты для X и Y для вывода текста по середине
$x = $bbox[0] + ($width_orig / 2) - ($bbox[4] / 2) - 5;
$y = $bbox[1] + ($height_orig / 2) - ($bbox[5] / 2) - 5;
return imagefttext($img, $px, 0, $x, $y, $color, $this->options['font'], $string);
}
/**
* function resizeFile
* функция пропорциональное уменьшение фото
* @param $url_file - адрес где будет новое фото лежать
* @param $file_tmp_name - $_FILES['tmp_name'] адрес до временной папки
* @param $maxWidth - максимальная нужная ширина
* @param $maxHeight - максимальная нужная высота
* @param int $quality - качество фото от 0-100
* @param string $type - тип фото
* @param string $string - произвольная строка-лейбл от вандалов
* @return bool
*/
protected function resizeFile($file_tmp_name,$url_file, $maxWidth, $maxHeight, $quality=100, $type,$string='')
{
if ($type = 'jpg' || $type = 'JPG') {
$type = 'jpeg';
}
$function = 'imagecreatefrom' . $type;
$img = $function($file_tmp_name); // создаем новое изображение
// получаем реальные размеры изображения
list($width_orig, $height_orig) = getimagesize($file_tmp_name);
// наносим текст по верх изображения
if ($this->options['file_text'] != ''){
$this->stringFile($img,$width_orig,$height_orig,$this->options['file_text']);
}
// сначало вычисляем коэффицент ($new_w / $size_w)
//и округляем число в большую сторону — в результате получаем ширину или высоту нового изображения
if ($width_orig > $maxWidth || $height_orig > $maxHeight) {
$new_width = ceil($width_orig / ($height_orig / $maxHeight));
$new_height = $maxHeight;
if ($new_width > $maxWidth) {
$new_height = ceil($height_orig /($width_orig / $maxWidth));
$new_width = $maxWidth;
}
} else {
$new_width = $width_orig;
$new_height = $height_orig;
}
//Создаём пустое изображение шириной и высотой
$dst = imagecreatetruecolor($new_width, $new_height);
ImageCopyResampled($dst, $img, 0, 0, 0, 0,$new_width, $new_height, $width_orig, $height_orig);
//Сохраняем полученное изображение в формате JPG
imagejpeg($dst, $url_file, $quality);
imagedestroy($img);
return true;
}
public function uploadFile()
{
// адрес до файла
if (is_array($this->file['name'])) {
/**
* в цыкле обрабатываем массив $this->file[] создаем SQL запрос для добавления в БД
* и записываем в папку
*/
foreach ($this->file['name'] as $key => $val) {
$type = $this->checkFile($val);
$new_name = $this->generateName($val) . '.' . $type;
// полный адрес до фото с новым именем
$url_file = $this->options['file_dir'] . $new_name;
// вызываем функцию ресайза
$this->resizeFile($this->file["tmp_name"][$key], $url_file, $this->options['maxWidth'],
$this->options['maxHeight'], 70, $type);
$this->resizeFile($this->file["tmp_name"][$key], $this->options['file_dir'] . 'thumb/'
. $new_name, $this->options['minWidth'], $this->options['minHeight'], 70, $type);
// записываем адреса до фото в массив для вывода
$this->result['link_file']['url'][] = $this->options['file_dir'] . $new_name;
// состовляем SQL запрос к БД
if ($this->options['table_name'] != '') {
$this->result['insert'] .= $this->insertQuery($key, $this->options['table_name'], $url_file);
} else {
// нужно сделать какой нит вывод если пошло что нит не так
// если нет имени таблицы
}
}
} else {
// оставил потому что пока не уверен что она не нужна
// надо сделать пару проверок...
move_uploaded_file($this->file["tmp_name"], $this->options['file_dir'] . $this->file["name"]);
}
// выводим положительный результат
return $this->result;
}
}