Fazendo um upload de arquivos em PHP

Veja nesse artigo como criar um mini sistema de upload de arquivos utilizando classes em PHP.

O PHP é uma das linguagens mais utilizadas no desenvolvimento web e nesse artigo trataremos do uso de classes no PHP.

Com a necessidade de enviar arquivos em diversos sistemas, é necessário que seja criada uma classe para que realize essa função.

Uma das principais funções de uma classe é a reutilização de código, ou seja, escrever menos e fazer mais e essa é a principal função da orientação a objetos.

Por medidas de segurança, antes de fazermos qualquer coisa, faremos uma verificação para ver se a página que contém a classe está sendo chamada direta pela URL. Por exemplo, se eu tento acessar o arquivo dessa forma: http://www.seuwebsite.com.br/suaClasse.php

Essa verificação vai nos retornar ao index (Página principal), pois não é seguro um usuário conseguir acessar as classes dessa forma.

Para fazer uma verificação desse tipo é preciso usar os comandos abaixo na listagem 1.

Listagem 1: Verificação

//Verificação de Segurança $url = $_SERVER["PHP_SELF"]; if(preg_match("class.Upload.php", "$url")) { header("Location: ../index.php"); }

Explicação do código:

A variável $url recebe o valor da URL atual. Usamos a função preg_match para NÃO fazer diferença entre minúsculas e maiúsculas em nossa comparação. Em seguida, é verificado se a URL digitada tem o mesmo nome do nosso arquivo.

Se positivo, usamos o header para enviar o usuário de volta para o index, ou para qualquer página que queira.

Após feita a verificação, já podemos começar a criação da nossa classe de upload.

Para esta classe, vamos usar 3 atributos, sendo eles: tipo, nome e tamanho.

Então nossa classe ficaria da seguinte forma:

Listagem 2: Classe Upload

class Upload { var $tipo; var $nome; var $tamanho; }

Com os atributos criados, podemos recuperar os dados do arquivo enviado. No PHP as variáveis não necessitam de tipagem, ou seja, não é necessário tipar como integer, string ou qualquer outro tipo, basta declará-las.

Nosso próximo passo em nossa classe é criar as funções. Nossa primeira função será a função upload, que apenas será utilizada para instanciarmos o objeto.

Listagem 3: Criando função upload

function Upload() { //criando o objeto }

Agora que a função está criada, podemos instanciar o objeto, usando o comando $arquivo = new Upload;

Porém, não existe nenhuma ação ainda, vamos criar nossa função principal.

Para esta função, serão necessários 3 atributos também, sendo eles:

Quando um arquivo for enviado ao servidor, se já houver outro arquivo com o mesmo nome, ele será substituido.

Iremos fazer então um hash (Um código), usando a encriptação MD5. Esse hash será gerado da junção do nome do arquivo com a data atual, então o nome do arquivo enviado ficará apenas um código extenso.

Por exemplo:

Arquivo Enviado: imagem_teste.jpg
Nome do arquivo depois de enviado ao servidor: 33ea8043909c3726e2eacbf4a82e5227.jpg

Com isso vamos evitar muitos erros a partir de caracteres especiais e nome de arquivos extensos e também evitaremos a substituição de arquivos em nosso servidor.

Vamos criar agora a função UploadImagem

Listagem 4: function UploadImagem

function UploadImagem($arquivo, $pasta, $tipos) { }

A primeira coisa que iremos fazer, é verificar se algum arquivo foi enviado, pois sem arquivo, não conseguimos fazer nada.

Iremos verificar com o isset, se o arquivo foi enviado, caso não tenha sido enviado nada irá acontecer. Caso o arquivo tenha sido postado, iremos recuperar alguns atributos dele.

Listagem 5: Verificando se o arquivo foi enviado

function UploadImagem($arquivo, $pasta, $tipos) { if(isset($arquivo)) { $nomeOriginal = $arquivo["name"]; $nomeFinal = md5($nomeOriginal . date("dmYHis")); $tipo = strrchr($arquivo["name"],"."); $tamanho = $arquivo["size"]; } }

Primeiramente, devemos saber que o arquivo vem em forma de array, contendo assim vários atributos.

A variável $nomeOriginal, que recebe o nome do arquivo é recuperada pela sintaxe $arquivo["name"].

Também é criada uma variável chamada $nomeFinal, que receberá o nome final do arquivo.

Lembre-se que acima falamos de um problema de sobrescrever arquivos e de caracteres especiais no nome do arquivo.

Para corrigir a questão dos novos arquivos sobrescreverem arquivos antigos é necessário utilizar criptografia MD5 e gerar uma hash criptografada md5($nomeOriginal . date("dmYHis"));

Usando isso, nosso arquivo deverá ficar com o nome parecido com: imagem_teste.jpg06012008102755

Criamos uma variável chamada $tipo e utilizamos o strrchr para pegar o último indíce depois do ".", no nome do arquivo. Sendo assim posso obter o tipo do arquivo.

Também criamos uma variável de nome $tamanho atribuímos a ela, o tamanho do nosso arquivo.

Com os dados recuperados, é preciso fazer uma verificação, para saber se o tipo do arquivo que estamos tentando enviar é permitido, ou seja, realizar uma validação no formato do arquivo.

Os tipos de arquivos permitidos são passados através da variável $tipos que é um array.

Vamos fazer um laço para varrer este array e comparar item por item para ver se a extensão do arquivo enviado é válido.

Listagem 6: Validação de tipo de arquivo

function UploadImagem($arquivo, $pasta, $tipos) { if(isset($arquivo)) { $nomeOriginal = $arquivo["name"]; $nomeFinal = md5($nomeOriginal . date("dmYHis")); $tipo = strrchr($arquivo["name"],"."); $tamanho = $arquivo["size"]; for($i=0;$i<=count($tipos);$i++) { if($tipos[$i] == $tipo) { $arquivoPermitido=true; } } if($arquivoPermitido==false) { echo "Extensão de arquivo não permitido!!"; exit; } } }

Agora que temos as nossas verificações feitas, vamos finalmente fazer o upload do arquivo.

Todo arquivo quando carregado, fica na pasta temporária do seu sistema operacional, sendo assim, temos que recuperar esse valor ao enviá-lo.

Listagem 7: Recuperando arquivo da pasta temporária

if (move_uploaded_file($arquivo["tmp_name"], $pasta . $nomeFinal . $tipo)) { $this->nome=$pasta . $nomeFinal . $tipo; $this->tipo=$tipo; $this->tamanho=number_format($arquivo["size"]/1024, 2) . "KB"; return true; }else{ return false; }

No código acima nós movemos o arquivo de pasta usando o código move_uploaded_file(arquivo, destino); passando os seguintes valores:

Quando colocamos o if(move_uploaded_file) estamos fazendo uma verificação. Se caso o arquivo não possa ser movido, retornamos false. Caso possa ser movido, executamos o código.

Ao final de tudo, nossa classe deve estar assim:

Listagem 8: classe Upload.php

<?php $url = $_SERVER["PHP_SELF"]; if(preg_match("class.Upload.php", "$url")) { header("Location: ../index.php"); } class Upload { var $tipo; var $nome; var $tamanho; function Upload() { //Criando objeto } function UploadArquivo($arquivo, $pasta, $tipos) { if(isset($arquivo)) { $nomeOriginal = $arquivo["name"]; $nomeFinal = md5($nomeOriginal . date("dmYHis")); $tipo = strrchr($arquivo["name"],"."); $tamanho = $arquivo["size"]; for($i=0;$i<=count($tipos);$i++) { if($tipos[$i] == $tipo) { $arquivoPermitido=true; } } if($arquivoPermitido==false) { echo "Extensão de arquivo não permitido!!"; exit; } if (move_uploaded_file($arquivo["tmp_name"], $pasta . $nomeFinal . $tipo)) { $this->nome=$pasta . $nomeFinal . $tipo; $this->tipo=$tipo; $this->tamanho=number_format($arquivo["size"]/1024, 2) . "KB"; return true; }else{ return false; } } } } ?>

Com a classe criada, só fica faltando instanciar o objeto na respectiva página e fazer a chamada.

Vamos agora criar uma página de envio de arquivos.

Listagem 9: Criando página formArquivo.html

<html> <head> <title>Enviando arquivos com PHP</title> </head> <body> <form action="envia_arquivos.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="300000"> <input name="userfile" type="file"> <input type="submit" value="Enviar Arquivo"> </form> </body> </html>

Nosso formulário ficará então da seguinte forma:


Figura 1: Formulário de Envio

Com o nosso formulário criado, vamos então fazer o upload do arquivo. Criaremos uma nova página com o nome de envia_arquivos.php.

Listagem 10: Criando página envia_arquivos.php

<?php include("class.Upload.php"); //define os tipos permitidos $tipos[0]=".gif"; $tipos[1]=".jpg"; $tipos[2]=".jpeg"; $tipos[3]=".png"; if(isset($HTTP_POST_FILES["userfile"])) { $upArquivo = new Upload; if($upArquivo->UploadArquivo($HTTP_POST_FILES["userfile"], "Imagens/", $tipos)) { $nome = $upArquivo->nome; $tipo = $upArquivo->tipo; $tamanho = $upArquivo->tamanho; }else{ echo "Falha no envio<br />"; } } ?> <strong>Nome do Arquivo Enviado:</strong> <?php echo $nome ?><br /> <strong>Tipo do Arquivo Enviado:</strong> <?php echo $tipo ?><br /> <strong>Tamanho do Arquivo Enviado:</strong> <?php echo $tamanho ?><br />

Conclusão

Nesse artigo foi mostrado como criar um pequeno sistema de envoi de arquivos em PHP. Espero que tenham gostado e até o próximo artigo.

Leia também

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados