Um pouco do que gosto, faço e crio
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
Popularity: 23%
30/10/2009 - 21:17
Ola Renan !!
es e o mais completo que ja vi.
valeu cara
vou testar, e se pintar uma duvida, comento com tigo
31/10/2009 - 15:19
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?
01/11/2009 - 09:46
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
04/11/2009 - 20:07
Olá Renam!
Renan muito obrigado por responder o comentario, analisei tudo que me mandaste,tem um feedbak pelo e-mail.
valeu! Abraço!
05/11/2009 - 08:25
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
22/01/2010 - 13:14
Renan
Poderia disponibilizar os fontes novamente…
Agradeço!
22/01/2010 - 14:10
Cleber,
Eu havia trocado de servidor, acabei esquecendo deste diretório.
Já está tudo arrumado: http://www.renanlima.com/downloads/uploadVerot.zip
20/02/2010 - 16:10
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 !
22/02/2010 - 10:00
Jonas, acredito que esta classe pode ser modificada e usada para este fim, mas ela por si só não faz isso.