Cakephp – Trabalhando Upload com a classe Verot
Na verdade a classe se chama somente class.upload.php ou Class Upload, é um nome meio genérico e por isso os desenvolvedores adotaram esta classe como Classe Verot. Isso porque Verot é o sobrenome do criador da class, seu nome é Colin VEROT.
Até hoje eu não encontrei uma class tão completa para trabalhar com imagens como esta, uso já faz alguns anos e hoje trabalhando com cakephp não foi diferente. Vou explicar aqui um pouco de como trabalhar com esta class dentro do Cakephp.
Primeiramente devemos transformar a class em um component. É muito simples, um component nada mais é do que uma class, então só devemos colocá-la dentro de uma class e estender para o objeto.
Baixe a class normal neste link: http://www.verot.net/php_class_upload_download.htm
Abra a class com seu editor e insira no inicio:
class UploadComponent extends Object {
Obs: Não se esquece de fechar a class no final.
Coloque dentro da pasta de components do seu projeto.
Pulando a parte de formulários e html, vamos ver como fica o controller.
No controller, habilite o component com public $components = array('Upload');
O script para fazer upload é bem simples, você pode até criar uma função no controller e depois chamar a função pelo método, veja como eu crio a função:
private function uploadImg($imagem){
$this->Upload->upload($imagem);
$imgName = date('dmY_His');
$this->Upload->file_new_name_body = $imgName;
$this->Upload->image_resize = true;
$this->Upload->image_x = 400;
$this->Upload->image_ratio_y = true;
$this->Upload->jpeg_quality = 70;
$this->Upload->allowed = array('image/jpeg','image/jpg','image/gif');
$this->Upload->process("img/usuarios/");
if ($this->Upload->processed) {
$this->Upload->clean();
} else {
$this->erro = $this->Upload->error;
}
return $imgName.".".$this->Upload->file_src_name_ext;
}
Linha 01: Iniciamos a função, eu criei como private, mas caso você precise usá-la em outros controllers, substitua private por public.
Linha 02: Iniciamos o componente nesta linha e o atribuÃmos a imagem. A variavel $imagem deve receber o array completo de um arquivo.
Linha 03: Definimos um nome padrão para o arquivo, eu costumo criar o arquivo como dia, mes, ano, hora, minuto e segundo.
Linha 04: AtribuÃmos o nome padrão que criamos para a variável do component file_new_name_body. O componente vai copiar o arquivo e dar o nome que atribuÃmos e não o mesmo nome do arquivo original.
Linha 05: image_resize serve para habilitar o redimensionamento da imagem. Caso ele esteja como false, a linhas 06 e 07 não irão funcionar.
Linha 06: Em image_x definimos o tamanho do redimensionamento da imagem.
Linha 07: image_ratio_y é muito importante, se a imagem estiver com o redimensionamento habilitado, esta variável faz que a altura da imagem seja redimencionada na proporção da largura, assim a imagem não fica distorcida.
Linha 08: A jpeg_quality copia o arquivo na qualidade escolhida, neste caso com a qualidade 70.
Linha 09: Allowed configura os tipos de arquivos que serão aceitos. Para aceitar todos os tipos de de imagens, é só colocar image/*.
Linha 10: Process é comando que executa o upload. Dentro de Process é o diretório que o arquivo será gravado.
Linha 11: Verifica se o upload foi um sucesso.
Linha 12: Se o upload for um sucesso, a função clean() vai executar uma limpeza do component.
Linha 14: Se o upload falhar, a função irá retornar o erro na variável $this->erro.
Linha 16: file_src_name_ext pega a extensão do arquivo, então eu aproveito para montar o nome do arquivo completo e retornar na função.
Dentro do método é só chamar a função, veja um exemplo:
$this->data['Model']['imagem'] = $this->uploadImg($this->data['Model']['imagem']);
Para trabalhar com o erro que a função gerou, basta imprimir a variável $this->erro.
A Class Verot é muito bem documentada, seu autor teve um cuidado nesse processo, tem uma explicação completa sobre todos os recursos da class. Você pode acompanhar a documentação completa neste link: http://www.verot.net/res/sources/class.upload.html.
Vou listar alguns dos recursos que a classe tem:
- Aplicar marcas d’agua na imagem
- Escrever na imagem
- Alterar contraste
- Aplicar efeito negative
- Cortar imagem
- Redimensionar de forma inteligente
- Alterar qualidade
- É possÃvel detectar a largura e altura da imagem e validar
- Converter em outros formatos: jpg, gif, png, bmp e etc
- Dar zoom na imagem
Há muito mais recursos, vale a pena conferir sua documentação.
Atualização [02-11-09]
Como algumas pessoas tiveram dúvidas quanto o component para cekaphp da class verot, disponibilizei para download neste link: http://www.renanlima.com/downloads/uploadVerot.zip
Thiago de Oliveira
Ola Renan !!
es e o mais completo que ja vi.
valeu cara
vou testar, e se pintar uma duvida, comento com tigo
Thiago de Oliveira
Olá Renan!
pois é Renam simplesmente não funciona, creio que seja alguma requisição interna da classe que esta fora da convenção do cake. não apresenta mensagem de erro. acontece somente quando adiciono o componet no controller. tem alguma ideia?
Renan Lima
Grande Thiago,
Te enviei um email dos fontes que usei em um projeto. Dê uma olhada lá, está bem explicado.
Enviei para thiago.home2 [at] gmail.com
[]‘s
Thiago de Oliveira
Olá Renam!
Renan muito obrigado por responder o comentario, analisei tudo que me mandaste,tem um feedbak pelo e-mail.
valeu! Abraço!
Renan Lima
Como algumas pessoas tiveram dúvidas quanto o component para cekaphp da class verot, disponibilizei para download neste link: http://www.renanlima.com/downloads/uploadVerot.zip
Cleber Hensel
Renan
Poderia disponibilizar os fontes novamente…
Agradeço!
Renan Lima
Cleber,
Eu havia trocado de servidor, acabei esquecendo deste diretório.
Já está tudo arrumado: http://www.renanlima.com/downloads/uploadVerot.zip
Jonas
Primeiramente parabens pelo blog Renan !
Gostaria de saber se atraves desta classe existe como eu mostrar o – progresso – do upload, pois como sao de varias imagens, eh interessante que nao deixe o usuario pensando que esta travado ou parado. ou que terminou sem terminar…
utilizei a classe conforme o artigo e funcionou perfeitamente, ficando apenas estas duvias .
Obrigado !
Renan Lima
Jonas, acredito que esta classe pode ser modificada e usada para este fim, mas ela por si só não faz isso.
Marco Antonio Arruda
Valew cara, deu certo de primeira.
Parabéns pelo blog.
Estarei acompanhando qualquer outro tópico a respeito de CakePHP
Sandro
e se eu quiser redimensionar a imagem somente se ela for maior que o tamanho que especifiquei?
Bruno
Aqui também funcionou de primeira.
Parabéns pelo tutorial, muito bom!
Um abraço!