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>
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 }
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.
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
- Manual do PHP:
Site oficial do PHP - MYSQL:
Site Oficial do Mysql - PHP no Wikipedia:
Mais informações sobre o Wikipedia
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.
Confira outros conteúdos:
Perguntas frequentes
Nossos casos de sucesso
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa bagagem consegui um estágio logo no início do meu primeiro período na faculdade.
Estudo aqui na Dev desde o meio do ano passado!
Nesse período a Dev me ajudou a crescer muito aqui no trampo.
Fui o primeiro desenvolvedor contratado pela minha
empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um
Full-Stack Dev!
Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a pena, pois a plataforma é bem intuitiva e muuuuito didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito obrigado!
Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento front-end, tinha coisas que eu ainda não tinha visto. A didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado, adorando demais.
Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É um passo a passo incrível. Só não aprende quem não quer. Foi o melhor investimento da minha vida!
Foi um dos melhores investimentos que já fiz na vida e tenho aprendido bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da programação, irei assinar meu contrato como programador graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana, aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem como não aprender, estão de parabéns!
Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na área.