dokkalfr 0 Denunciar post Postado Novembro 16, 2004 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] Compartilhar este post Link para o post Compartilhar em outros sites
dokkalfr 0 Denunciar post Postado Novembro 17, 2004 Só adicionando, o artigo que eu pus no post anterior é direcionado a PHP5, um bom artigo em PHP4 está em http://www.phpbuilder.com/columns/timlin20040528.php3 Compartilhar este post Link para o post Compartilhar em outros sites