Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Acho que já postei isso, mas eu não achei o post ... como eu já tava dormindo quando terminei pode ser qeu eu tenha sonhado ... ahahahahaha http://forum.imasters.com.br/public/style_emoticons/default/blush.gif
Estou em um projeto que necessita que eu trabahe com imagens JPEG em um banco de dados mySQL. Optei pelo PEAR_DB na camada de dados.
Utilizei DAO e VO e consegui resultados muito bons. Como clareza de código e facilidade de manutenção.
O PEAR_DB também é bastante poderoso e fácil de utilizar!!
Mostro isso com 2 proprositos:
1) incentivar o uso de OO o/
2) incentivar a leitura dos manuais (deixem a preguiça de lado!!). eu nunca tinha trabalhado com imagens no PHP ou com as classes do PEAR até este trabaho, mas encontrei tudo que precisei no manual do PHP e do PEAR. Alguns artigos encontrados pelo Google me ajudaram a fazer melhorias.
Vou mostrar dois scripts que fazem parte do sistema:
Para inserir fotos no banco de dados: Este arquivo é o action de um formulario que contem n campos do tipo "file".
**PHP** [/tr][tr]<?php
require '../dataaccess/Fotos.php';
$Fotos = new daoFotos;
if ($_POST['form'] == 'sent') {
//O formulario envia 5 campos com fotos
$error = $Fotos->insertFromForm(5);
//verifica erros
if (!empty ($error))
{
print '<pre>';
print_r ($error);
exit;
}
}
?>
[/tr]
Para mostrar thumbnail: Para mostrar a imagem ampliada é só trocar a propriedade thumbnail para imagem_ampiada.
**PHP** [/tr][tr]<?php
header ("Content-type: image/jpeg");
require 'dataaccess/Fotos.php';
$Fotos = new daoFotos;
$img = $Fotos->getById($_GET['id']);
echo $img->thumbnail;
?>
[/tr]
Segue o fonte da classe pra quem quiser estudar:
PHP [/tr][tr]/*** Estas classes formam uma camada entre os dados e visualização.
* @author Alexandre Gravem <gravem@gmail.com>
*/
define ("IMAGEM_AMPLIADA_X",320);
define ("IMAGEM_AMPLIADA_Y",240);
define ("THUMBNAIL_X",60);
define ("THUMBNAIL_Y",60);
require_once dirname(__FILE__) .'/'. '../database.php';
/**
* Abstração da tabela fotos.
*/
class daoFotos
{
/**
* Busca uma foto pelo seu id.
* @param int $id identificador da foto desejada
* @return obj objeto da classe Foto
*/
function & getById ($id)
{
global $DB;
$sql = "SELECT mime_type,imagem_ampliada,thumbnail, descricao "
. "FROM fotos "
. "WHERE foto_id = $id";
$data = $DB->getRow($sql,array(),DB_FETCHMODE_ASSOC);
if (DB::isError ($data)) die ($data->getMessage());
$vo = new Foto;
if (!$vo->import($data)) die ("Erro importando resultado");
return $vo;
}
/**
* Insere fotos no banco de dados apartir de
* dados enviados por formulário.
* @param int $NUM_FILES numero de arquivos enviados
* @return mixed false caso tudo ocorra bem ou um array com detalhes dos erros
*/
function insertFromForm ($NUM_FILES)
{
global $DB;
$a = array();
$fails = array();
for ($i = 0; $i < $NUM_FILES; $i++) {
//executa tarefa baseada nas possiveis mensagens de erro
switch ($_FILES['arquivo']['error'][$i]) {
case UPLOAD_ERR_INI_SIZE:
echo 'foo';
$fails[]['arquivo'] = $_FILES['arquivo']['name'][$i];
$fails[]['mensagem'] = "Arquivo maior que " . ini_get ('upload_max_filesize') + 0 . "Megabytes";
$fails[]['codigo'] = UPLOAD_ERR_INI_SIZE;
break;
//não processa campos vazios
case UPLOAD_ERR_NO_FILE:break;
case UPLOAD_ERR_PARTIAL:
$fails[]['arquivo'] = $_FILES['arquivo']['name'][$i];
$fails[]['mensagem'] = "O arquivo foi carregado parcialmente";
$fails[]['codigo'] = UPLOAD_ERR_PARTIAL;
break;
default:
//transforma a imagem carregada em um binário trabalhavel
$img= imagecreatefromjpeg ($_FILES['arquivo']['tmp_name'][$i]);
$SX = imagesx($img);
$SY = imagesy($img);
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-#
//cria a imagem de tamanho ampliado
$tmp_en = tempnam('/tmp','IMG');
$enlarged = imagecreatetruecolor (IMAGEM_AMPLIADA_X,IMAGEM_AMPLIADA_Y);
imageCopyResized ($enlarged,$img,0,0,0,0,IMAGEM_AMPLIADA_X,IMAGEM_AMPLIADA_Y,$SX,$SY);
imagejpeg($enlarged,$tmp_en);
imagedestroy ($enlarged);
//binário que será guardado
$image = addslashes (file_get_contents ($tmp_en));
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-#
//cria thumbnail
$tmp_th = tempnam('/tmp','IMG');
$thumb = imagecreatetruecolor (THUMBNAIL_X,THUMBNAIL_Y);
imageCopyResized ($thumb,$img,0,0,0,0,THUMBNAIL_X,THUMBNAIL_Y,$SX,$SY);
imagejpeg($thumb, $tmp_th);
imagedestroy ($thumb);
//thumbnail a ser guardado
$thumbnail = addslashes (file_get_contents ($tmp_th));
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-#
//Inserção no banco de dados
$sql = "INSERT "
. "INTO fotos (album_id,descricao,mime_type,data_upload,upload_por,thumbnail,imagem_ampliada) "
. "VALUES (%d,'%s','%s',%d,%d,'%s','%s')";
$insert_string = sprintf (
$sql,
1,
$_POST['descricao'][$i],
$_FILES['arquivo']['type'][$i],
mktime(),
1,
$thumbnail,
$image
);
if (DB::isError ( $e = $DB->query ($insert_string) )) {
die ($e->getMessage());
}
}
}
return $fails;
}
}
/**
* Value Object. Abstrai uma linha da tabela
*/
class Foto
{
#-=-=-=-=-=-=-=-=-=-=-#
# Campos da tabela #
#-=-=-=-=-=-=-=-=-=-=-#
var $album_id;
var $thumbnail;
var $mime_type;
var $imagem_ampliada;
var $descricao;
var $data_upload;
var $upload_por;
/**
* Importa dados da linha a partir de um array
* associativo. Com este método o objeto pode ser
* populado com resultados de uma busca.
* @param array $row dados da linha atual
* @return bool
*/
function importDataFromArray (&$row)
{
if (! is_array($row)) return false;
$this->thumbnail = $row['thumbnail'];
$this->mime_type = $row['mime_type'];
$this->imagem_ampliada = $row['imagem_ampliada'];
$this->descricao = $row['descricao'];
$this->album_id = $row['album_id'];
$this->data_upload = $row['data_upload'];
$this->upload_por = $row['upload_por'];
return true;
}
}
[/tr]
Carregando comentários...