Довольно типичная задача, не так ли? Как я предлагаю ее реализовать:
<?php
/* Здесь код, обрабатывающий ошибки */
$foto=new Foto(array(),$db); // создаем объект для фотографии, $db - объект класса PDO
$foto->foto_name=md5(uniqid(mt_rand(),true)); // задаем имя для сохраняемой картинки
if(!empty($_FILES['foto_1']['name'])){
$foto->Load($_FILES['foto_1']) // загружаем
->Resize(200) // делаем ресайз
->Save(PATH_FOTO_NEWS_1)// сохраняем на диске
->SaveDb(TABLE_NEWS_FOTOS, intval($_POST['news_id'])); // сохраняем в базе
}
?>
Основной файл для поддержки синтаксиса:
<?php
require_once('image.php');
class Foto{
public $Image;
private $file_info;
private $db;
private $table;
private $folder;
public $errors;
public $foto_name;
function __construct($file,$db,$table=false,$folder=false){
if(!empty($file['name'])){
$this->Image= new Image(0,0,0,$file['tmp_name'],GetDximageType($file['type']),0,1);
$this->file_info=$file;
}
$this->db=$db;
if($table) $this->table=$table;
if($folder) $this->folder=$folder;
}
/**
* Загрузить фотографию из файла
*
* @param array ($_FILES) $from
* @return Foto
*/
function Load($from){
$this->__construct($from,$this->db);
return $this;
}
/**
* Изменить размер
*
* @param int $width
* @param int $height
* @return Foto
*/
function Resize($width, $height=false){
if(is_object($this->Image)){
$this->Image->image_resize($width,$height,true);
}
return $this;
}
/**
* Сохранить
*
* @param string $folder
* @param string $name
* @return Foto
*/
function Save($folder=false,$name=false){
if(!$folder){
if($this->folder){
$folder = $this->folder;
} else {
array_push($this->errors,FOTO_FOLDER_NOT_ASIGN);
return false;
}
}
//генерируем имя фотки
if(!$name) $foto_name=md5(uniqid(mt_rand(),true));
else $foto_name=$name;
$this->foto_name=$foto_name;
// Сохраняем на диске
$this->Image->image_output(0,$folder.'/'.$foto_name.".png");
$foto_errors=$this->Image->get_last_error();
if($foto_errors[0]) array_push($this->errors,$foto_errors[1]);
return $this;
}
function GetLastFotoName(){
return $this->foto_name;
}
//заносим ее в базу
function SaveDb($table, $model_id){
try{
$res=$this->db->prepare("INSERT INTO $table (foto,model_id) VALUES ('$this->foto_name.png', $model_id)");
$good=$res->execute();
} catch (PDOException $e){
if(DEBUG) print "ERROR!!! : ".$e->getMessage()."<br />";
else array_push($this->errors,DB_ERROR);
}
}
function GetFromDb($table,$model_id){
try{
$res=$this->db->prepare("SELECT foto FROM $table WHERE model_id=$model_id");
$res->execute();
$res=$res->fetchAll(PDO::FETCH_COLUMN);
return $res;
} catch (PDOException $e){
if(DEBUG) print "ERROR!!! : ".$e->getMessage()."<br />";
else array_push($this->errors,DB_ERROR);
}
}
}
?>
image.php не стал выкладывать, т.к. он большой и не мой.
Сами файлы:
foto.php и
image.php
для включения этих возможностей в Ваш проект, просто положите эти файлы в одну папку, и подключите файл foto.php
Прошу ругать.
Спустя 16 минут, 48 секунд (1.04.2010 - 23:39) twin написал(а):
Посмотри тут, может что пригодится.
Спустя 11 минут, 8 секунд (1.04.2010 - 23:50) b00tanik написал(а):
Цитата (twin @ 1.04.2010 - 20:39) |
Посмотри тут, может что пригодится. |
Немножко разные весовые категории - у Вашего класса больше функции и возможностей настройки, мой - это скорее результат лени.
Хотя есть несколько конструктивных идей, которые я с радостью утащу
