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:
- O usuário inicia o upload
- Verifica-se se algum arquivo chegou ao servidor
- Procura-se por erros ou fraudes no arquivo enviado
- 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.