FIleUploader behavior para CakePHP

Uma tarefa que normalmente é recorrente em aplicações de variados tamanhos é o upload de arquivos. Também é comum que a tarefa se resuma em simples passos:

  1. O usuário inicia o upload
  2. Verifica-se se algum arquivo chegou ao servidor
  3. Procura-se por erros ou fraudes no arquivo enviado
  4. Armazena-se o arquivo em um diretório no servidor

Podem existir passos intermediários, como um processamento dependente do arquivo enviado, mas são casos mais específicos.

Como desenvolvedor, sempre tive que fazer o upload com esse cenário se repetindo em diversos projetos. Até que em um determinado momento decidi fazer o meu próprio Behavior [1] de upload para CakePHP.

Ele é simples e genérico o bastante para me atender na maioria dos projetos, espero que sirva para vocês também. Aqui está o link do dele no Github [2].

Basicamente o behavior segue os passos descritos acima, mas com um detalhe importante: ele é melhor utilizado com o recurso de Media Views [3]. Para quem não conhece é um modo de envio de arquivos ao browser que não passa pelo webroot. Também é possível utilizar o Behavior sem as Media Views, o que necessita de uma configuração adicional. Falando nela, aqui vai um exemplo de como utilizar o Behavior.


<?php
    //configurações no modelo
    Class MyModel extends AppModel
    {
        public $&;actsAs = array('FileUpload' => array(
                'uploadRoot' => 'media', //relativo ao APP, media é o valor default. Para utilizar img dentro de webroot, utilize webroot . DS . img
                'uploadPath' => 'images' . DS . 'users' //pasta dentro de uploadMedia
            )
        );
    }
    
    //realizando o upload no Controller
    Class MyController extends AppController
    {
        public function MyAction()
        {
            $&;upload = $&;mimetypes = array('jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg');
            $&;this->MyModel->upload($&;this->request->data['MyFile'], $&;mimetypes);
            /*
            * Neste ponto a variavel upload é um array com as seguintes chaves (úteis para utilizar media views)
            * status: bool com status da operação 
            * mimetype: string com mimetype do arquivo enviado
            * extension: string com extensão do arquivo enviado
            * filename: string com nome do arquivo enviado no server
            * md5: string com md5 do arquivo enviado
            * message: string com mensagem em caso de erro
            */
            if ($&;upload['status'])
            {
                //faça algo legal
            }
            else
            {
                //utilize a mensagem de erro do behavior
            }
        }
    }
?>

A configuração no modelo é bem simples, utiliza somente duas variáveis, sendo uma opcional. O diretório padrão (uploadRoot) de upload é relativo ao constante APP do CakePHP, e seu valor é media. Se deseja realizar uploads no webroot, será necessário definir o caminho relativo ao APP, por exemplo, webroot . DS . img para imagens. Já a chave uploadPath define o diretório em que os arquivos serão armazenados, relativos ao uploadRoot. Por exemplo, os arquivos com as imagens dos perfis dos usuários no diretório users.

Para realizar o upload basta uma linha de código chamando o método upload que recebe dois parâmetros: primeiro o array que armazena o arquivo (será um array igual ao $_FILES [4]) e o segundo é um array com os tipos de arquivo permitidos, no formato array(‘extensão’ => ‘mimetype’). O Behavior realiza uma verificação de segurança utilizando o mimetype dos arquivos enviados.

É isso pessoal, quem tiver dúvidas de utilização é só perguntar. Fiquem a vontade para fazer seus forks e adequar o projeto para suas necessidades.

  1. Behaviors
  2. FileUpload Behavior
  3. Media Views
  4. Documentação do PHP para o $_FILES

Leave a Reply

Your email address will not be published. Required fields are marked *