Detalhando upload em PHP com detalhes e passo a passo

Detalhando upload em PHP com detalhes e passo a passoTema de hoje é detalhando upload em PHP, sempre pensando no roteiro de estudos para certificação apesar de andar meio ausente por esses dias, hoje vou abordar um tema interessante que consiste em como efetuar uploads de arquivos com PHP.  
 
Muitos podem questionar “mas esse tema existe aos montes na WEB“, de fato é verdade mesmo existem vários tutoriais excelentes na WEB até classes muito bem elaboradas, mas nesse caso vou tentar esgotar certos detalhes que as vezes passam desapercebidos.
 
O que é Upload?
Upload é o termo usado para ação de envio de dados a partir de um computador local para um servidor remoto normalmente através da internet.
 
HTML
Agora que já temos uma breve definição de upload, vamos construir nosso formulário WEB e posteriormente detalhar seu funcionamento. Para efetuarmos um upload precisamos basicamente de um formulário HTML que envia a submissão para um script PHP onde sera executado o upload de fato para a pasta que desejarmos. Esse formulário será bem simples, sem estilização com folhas de estilo em CSS, somente com as funcionalidades básicas.

index.php

O formulário acima é bem simples e será submetido para um script PHP como podemos observar no action=”upload.php”, mas existe uma característica diferente dos formulário que estamos acostumados a construir, o atributo “enctype” na tag

. Podem ter certeza que a falta dessa  informação já  fez vários  programadores perderem horas procurando um erro pelo qual o  upload não funciona. 
 
O atributo enctype identifica como os dados do  formulário devem ser codificados quando enviados para o  servidor, por padrão quando não informamos nada esse atributo é preenchido com o valor “application/x-www-form-urlencoded“, abaixo uma breve definição dos  3 tipos aceitos  nesse atributo:
 
application/x-www-form-urlencoded – Todos os caracteres são  codificados antes de serem enviados, converte espaços em ‘+’ e caracteres especiais em valores ASCII HEX.
 
multipart/form-data – Os caracteres não são codificados, esse valor é utilizado quando  precisamos trabalhar com upload  de arquivos no formulário.
 
text/plain – Os espaço são convertidos em ‘+’, mas os caracteres especiais não são codificados
 
Com essas definições já fica fácil de saber o  porque temos que usar enctype=”multipart/form-data”  para trabalhar com upload  no  formulário, mas ainda tem mais  um detalhe. Sempre que o formulário for executar uploads temos que setar o atributo method=”POST“, isso porque apesar de muitos tentarem (srsrsr) ainda não é possível enviar arquivos  via  método GET.
 
Existe ainda uma variação do elemento input com type=”file” implementada a partir do HTML 5, é a inclusão do atributo “multiple” que  possibilita o envio de vários valores (arquivos) no mesmo elemento. Mas não vamos nos ater a esse detalhe nesse artigo, segundo o site http://caniuse.com/ o atributo multiple é suportado a partir do IE 10, outros  navegadores já tem suporte.

 

Post relacionado:  Sistema de Login com AJAX e PHP - Blindado

PHP

Finalizado a explicação do formulário HTML vamos para o script PHP que vai receber a submissão do nosso formulário

upload.php

 

Detalhando upload em PHP

O script PHP acima tem vários pontos importantes para serem destacados, o objetivo dele é receber a submissão e gravar o arquivo enviado no diretório pré-determinado, nesse exemplo será a pasta com o nome “img“. Mas antes de copiar o arquivo temos que fazer uma série de verificações para que o nosso script grave no local correto, com o nome original e outras verificações por motivo de segurança.

É importante entender que quando enviamos uma submissão contendo um elemento input com type=”file” para um script PHP temos acesso a um array associativo chamado $_FILES[], esse array possui elementos contendo informações importantes do arquivo enviado pela submissão, vale ressaltar que mesmo que nenhum arquivo seja enviado o array $_FILES[] vai existir. Através dessas informações podemos manipular o arquivo e até possíveis erros que possam ocorrer durante o upload, vamos aos elementos do $_FILES[‘upload’] usamos o name do input (upload) para acessar o array:

Post relacionado:  Gerar PDF com PHP e a biblioteca mPDF

$_FILES[‘upload’][‘name’] – Nome original do arquivo.

$_FILES[‘upload’][‘type’] – O tipo mime do arquivo, se o browser deu esta informação. Um exemplo pode ser “image/gif”.

$_FILES[‘upload’][‘size’] – Tamanho em bytes do arquivo.

$_FILES[‘upload’][‘tmp_name’] –  O nome temporário do arquivo, como foi guardado no servidor.

$_FILES[‘upload’][‘error’] – O código de erro associado a este upload de arquivo. (no decorrer do artigo teremos as definições dos erros) 

 
Na linha abaixo estou verificando se existe a array $_FILES[] e se o elemento size desse array é maior que 0, executamos 2 verificações porque mesmo que formulário seja enviado sem nenhum arquivo o array $_FILES[] sempre vai existir, nesse caso ainda verifico o size para ter certeza que realmente foi enviado um arquivo.

 
Nessa linha abaixo verifico se o upload foi enviado via POST HTTP, sempre existe a possibilidade de um usuário mal intencionado alterar o conteúdo do envio.

 
Nesse ponto o script verifica se existe o diretório de destino, senão existir será criada a pasta com o nome que precisamos /img. Essa verificação ajuda muito porque as vezes podemos esquecer de criar a pasta de destino dos arquivos e consequentemente não funcionar o upload. Por padrão o função mkdir() cria pastas com as permissões 0777, ou seja, acesso mais abrangente é possível alterar essas permissões mas vale ressaltar que se as permissões forem restritas não será possível copiar o arquivo para pasta. 

 
Para melhor visualização e didática, estou montando o caminho de destino separado, apenas concatenando o nome da pasta que temos certeza que existe porque verificamos acima com o nome original do arquivo.

 
Ufa …. agora chegou a parte que realmente interessa, a função move_uploaded_file() recebe 2 parâmetros (1 – nome temporário, 2 – caminho com o nome que será gravado o arquivo) e copia o arquivo da pasta temporária para a pasta de destino que determinamos acima, se for executado com sucesso retorna TRUE senão retorna FALSE, com esse retorno podemos verificar se ocorreu tudo bem e emitir uma mensagem no sucesso ou no erro.

 
No início do script verificamos se existia o array $_FILES[] e se o size é maior que 0, mas se uma das condições for FALSE, então temos que redirecionar o fluxo de dados para o bloco ELSE. Nesse bloco apenas verifico com switch qual o erro que possivelmente está no elemento error do array, posteriormente exibo uma mensagem na página. Observem que para o valor 0 somente comentei, porque esse valor indica que o upload foi feito com sucesso, caso não exista nenhum valor no elemento error será exibida a mensagem com a opção default.

 
Bom pessoal, nesse artigo procurei detalhar ao máximo como trabalhar com upload em PHP, claro que demonstrei aqui apenas o básico com as explicações e lembretes. O formulário HTML e o script PHP podem ser melhorados de diversas maneiras, mas acredito que as verificações feitas no script deixam ele bem útil para o nosso dia a dia.
 
Até a próxima ….
Post relacionado:  Corrigir charset em páginas PHP
Tags:
Show Buttons
Hide Buttons