O que entender sobre Uploads no Codeigniter

O upload de arquivos é uma funcionalidade bastante comum em aplicações web dos mais variados tipos, e quando isso é necessário os arquivos são geralmente armazenados diretamente no banco de dados ou em um diretório do sistema. A estratégia a ser utilizada dependerá principalmente da quantidade de registros e do tamanho ocupado por eles.

Neste artigo veremos como implementar o upload em um sistema desenvolvido com o framework CodeIgniter, armazenando os arquivos em uma pasta da própria aplicação. Essa prática é comum quando se tem muitos arquivos a serem salvos e/ou seu tamanho é considerado grande. Caso fossem mantidos no banco de dados, este cresceria demasiadamente, dificultando a realização de backups periódicos e comprometendo seu desempenho.

Passo 1: Configurando a view

Neste exemplo simularemos um cadastro de currículos que permitirá a inserção do CPF do candidato e de um arquivo em formato PDF contendo suas informações. Como o nosso foco é receber e armazenar os arquivos, não criaremos models ou utilizaremos banco de dados. Em uma aplicação real, os trechos de código aqui apresentados podem ser facilmente acoplados a funções que já realizem cadastros completos.

Começaremos criando a view que conterá o formulário para cadastro do currículo. Para isso, adicionaremos ao diretório views uma pasta chamada currículos e dentro dela um arquivo cadastro.php, cujo código pode ser visto na Listagem 1.


01 <form action="salvar" method="POST" enctype="multipart/form-data">
02     <input type="text" name="cpf" placeholder="Informe seu CPF"/>
03     <br/>
04     <input type="file" name="curriculo">
05     <br/>
06     <input type="submit" value="Salvar"/>
07 </form>
Listagem 1. View para upload de arquivos

Linha 1: o atributo enctype do form deve ser preenchido com o valor multipart/form-data, para que ele seja capaz de receber arquivos e repassá-los ao servidor na requisição POST;

Linha 4: o campo que irá receber o arquivo deve ser do tipo file, tipo de input destinado a essa funcionalidade no HTML.

Passo 2: Implementando o controller

Para que a view seja exibida, é necessário criar o controller Curriculos e nele adicionar uma função para exibir a página de cadastro. O código a seguir demonstra essa função, que basicamente carrega a view que acabamos de criar:


01 public function cadastro(){
02     $this->load->view('curriculos/cadastro');
03 }

Com isso já será possível acessar o sistema através da URL http://<endereço base>/index.php/currículos/cadastro e visualizar o formulário para upload do currículo.

Agora, precisamos criar a função que receberá os dados do formulário e salvará o arquivo. Como podemos perceber na linha 1 da Listagem 1, na action do form, essa função se chamará salvar e seu código pode ser visto na Listagem 2.


01 public function salvar(){
02     $cpf          = $this->input->post('cpf');
03     $curriculo    = $_FILES['curriculo'];
04     $configuracao = array(
05         'upload_path'   => './curriculos/',
06         'allowed_types' => 'pdf',
07         'file_name'     => $cpf.'.pdf',
08         'max_size'      => '500'
09     );      
10     $this->load->library('upload');
11     $this->upload->initialize($configuracao);
12     if ($this->upload->do_upload('curriculo'))
13         echo 'Arquivo salvo com sucesso.';
14     else
15         echo $this->upload->display_errors();
16 }
Listagem 2. Função de upload no controller

Linha 2: recuperamos o valor do campo cpf preenchido no form. Esse valor será usado apenas para renomear o arquivo ao salvá-lo;

Linha 3: recuperamos o arquivo submetido;

Linhas 4 a 9: configuramos os parâmetros necessários para o upload de arquivos, como a pasta onde serão salvos (upload_path), os tipos de arquivo permitidos (allowed_types), o nome com que será salvo (file_name) e o tamanho máximo em kilobytes (max_size);

Linha 10: carregamos a biblioteca responsável pelo upload de arquivos;

Linha 11: configuramos a biblioteca com os parâmetros previamente definidos;

Linha 12: efetuamos o upload com a função $this->upload->do_upload. Caso o arquivo seja salvo com sucesso, exibimos uma mensagem (linha 13), caso contrário apresentamos os erros para o usuário (linha 15).

Antes de testar o upload, é necessário criar a pasta currículos no diretório do projeto e no mesmo nível da pasta application. Feito isso, basta acessar o formulário, preencher o CPF, selecionar o arquivo e enviar os dados. Esse processo é ilustrado na Figura 1.

Upload de arquivos no CodeIgniter

Figura 1. Telas do sistema de upload de arquivos

Caso o upload não seja bem-sucedido, algumas mensagens podem ser exibidas. Dentre elas, as mais comuns são:

  • The uploaded file exceeds the maximum allowed size in your PHP configuration file: o arquivo enviado excede o tamanho máximo aceito;
  • The filetype you are attempting to upload is not allowed: o tipo do arquivo enviado não está na lista dos que são aceitos;
  • The upload path does not appear to be valid: o caminho onde o arquivo será salvo é inválido.

Passo 3: Realizando o upload de imagens

Caso os arquivos que serão submetidos no seu sistema sejam imagens, o procedimento é o mesmo mostrado anteriormente, bastando alterar o tipo de arquivo suportado (allowed_types) e adicionar dois atributos extras ao array de configuração:

  • max_width: largura máxima da imagem, em pixels;
  • max_height: altura máxima da imagem, também em pixels.

Neste caso, outra mensagem de erro comum é a seguinte:

  • The image you are attempting to upload doesn't fit into the allowed dimensions: as dimensões da imagem excedem os valores máximos permitidos.

Links Úteis

Saiba mais sobre PHP ;)

  • Documentação: PHP: While e Do While:
    Este documento apresenta as estruturas de repetição while e do while, recursos que possibilitam executar trechos de código repetidamente com base em uma expressão booleana.
  • Como implementar o MVC em PHP:
    O padrão MVC é amplamente utilizado no desenvolvimento de aplicações web, e saber implementá-lo é importante para trabalhar de forma eficiente com frameworks como CodeIgniter e Laravel, bem como para desenvolver projetos sem depender dessas soluções de terceiros.
  • Documentação: PHP: Declaração e atribuição de variáveis:
    Neste documento você encontrará o conteúdo que precisa para aprender a declarar e utilizar variáveis na linguagem PHP. É por meio das variáveis que conseguimos guardar os dados em memória e acessá-los quando necessário.