[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: класс загрузки фото
pamparam
Это первый мой класс
)))

Не судите строго ))



<?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;

}
}


Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.