Idioma:

Enviando um arquivo para o servidor via PHP

10 de fevereiro de 2011 | Em Web | 4,9 mil visualizações | Por

Clique e compartilhe: 


O PHP suporta várias funcionalidades, por isso o seu grande sucesso entre os programadores que procuram facilidade de programação, suporta bases de dados,
corre independentemente do sistema operativo utilizado e hardware, entre outros.

Dentro das funcionalidades do PHP está o suporte para o envio de arquivos para o servidor através de um formulário HTML. Qualquer tipo de arquivo pode ser enviado para o servidor, seja ele uma imagem, um arquivo de texto, uma base de dados, etc., ou melhor dizendo, seja o arquivo binário ou texto.

Para enviar um arquivo, primeiro precisamos de criar um formulário para o utilizador indicar qual o arquivo que deseja enviar:

<form method=post enctype="multipart/form-data" action="teste.php">
<input type="file" name="arquivo">
<input type="submit" name="submit" value="Enviar arquivo">
</form>

ATENÇÃO: O parâmetro “enctype” é obrigatório, sem ele não é possível enviar o arquivo para o servidor!

Para o php aceitar o arquivo, alguns parâmetros devem estar configurados correctamente no php:

file_uploads = On - O PHP aceita o envio de arquivo;

upload_tmp_dir = Qual o diretório que onde o php guardará "temporariamente" o arquivo enviado.

upload_max_filesize = 2M - Tamanho máximo do arquivo aceito pelo php

Normalmente o PHP já vem configurado para aceitar o upload de arquivos, mas é sempre bom verificar a sua configuração no php.ini para não ter mais tarde dores de cabeça.

Além do limite de tamanho do arquivo imposto pela configuração do php (que serve para todos os scripts do servidor) podemos também limitar o tamanho utilizando uma configuração do formulário:

<input type="hidden" name="MAX_FILE_SIZE" value="1024">

Neste caso estamos a limitar o tamanho máximo do arquivo em 1024 bytes. Mas não é recomendável confiar neste parâmetro, pois qualquer pessoa com algum conhecimento de HTML conseguirá retirar este limite. Mais abaixo mostrarei outra solução para isto.

Tudo bem, o utilizador selecionou o arquivo para ser enviado e pressionou o botão “Enviar arquivo”, se crias-te um arquivo com o formulário acima e um arquivo “teste.php” (pode ser o mesmo arquivo do formulário) o browser do utilizador irá enviar o arquivo para o servidor, e nada vai acontecer, além do php ter guardado o arquivo no directório temporário e apagado o arquivo no final da execução do script. Então teremos que fazer mais qualquer coisa com o arquivo. Após receber o arquivo, o php guarda-o num directório temporário, com um nome escolhido por ele, e criará várias variáveis globais com informações deste arquivo, baseadas no nome que escolhemos para o campo, no nosso caso “arquivo”:

$arquivo : nome do arquivo, com seu caminho absoluto, onde o php o guardou
$arquivo_name : nome do arquivo, absoluto, na máquina do utilizador
$arquivo_size : tamanho em bytes do arquivo
$arquivo_type : tipo "MIME" do arquivo

Com essas variáveis podemos agora fazer qualquer coisa com o arquivo. Podemos, por exemplo, verificar se o arquivo tem um tamanho abaixo do limite maximo desejado para ser enviado (isto é muito importante, pois impossibilita que alguém envie um arquivo tão grande que possa bloquear o servidor). Usamos o seguinte script:

<?php
if($arquivo_size > 1024) {
print "O tamanho do arquivo é maior do que o limite permitido<br>";
exit;
}
?>

Para não deixar alguns utilizadores irritados, podemos usar as duas opções juntas, o limite configurado dentro do formulário e o limite dentro do script, assim os utilizadores normais não terão a decepção de esperar vários minutos para enviar o arquivo para o servidor e só depois serem avisados que o arquivo era grande demais, assim o browser acusa o tamanho demasiado grande antes de enviar o arquivo, e os utilizadores “espertinhos” terão uma decepção ao descobrir que existia outra limitação.

Precisamos agora fazer alguma coisa com o arquivo antes de terminar o script, senão o php irá apagá-lo. Temos o nome do arquivo na váriavel “arquivo”, então precisamos colocá-lo num lugar do servidor. Podemos usar a função do php “copy”. A função copy exige 2 parâmetros: fonte e destino, e retorna verdadeiro ou falso, ou seja, se copiou ou não. Atenção para quem vai usar este método num sistema Linux, unix ou qualquer outro que tenha suporte para permissões de arquivos, pois a função “copy” irá executar uma cópia do arquivo como o utilizador que executa o servidor, portanto, se o utilizador/grupo que executa o servidor não tiver permissão de escrita no directório de destino, não vai ser possível copiar o arquivo para lá. Neste caso, tente gravar no /tmp, que costuma ter permissão de escrita para todos os utilizadores, ou dê a permissão a um directório específico só para gravar os arquivos. Supondo que o servidor tem permissão de escrita no subdirectório arquivo do directório do nosso script, vamos gravar:

<?php
....
if(copy($arquivo,"arquivo/arquivo_do_utilizador")) {
print "O arquivo foi recebido com êxito!<br>";
} else {
print "Ocorreu um erro ao receber o arquivo!<br>";
}
?>

Pronto, agora o arquivo foi salvo como arquivo_do_utilizador no subdiretório arquivo. Note que todos os utilizadors que enviarem o arquivo para o servidor terão os seus arquivo salvos com o mesmo nome, portanto, só um arquivo irá existir, e será o arquivo do último utilizador que enviou o arquivo.

Fica para o leitor o exercício de criar um arquivo único para cada utilizador e que um mesmo utilizador não consiga enviar mais do que três arquivos por login.

De Ivaiporã/PR, Engenheiro de Computação, Administrador do Grupo Dicas em Geral. Apaixonado por Tecnologia e Informática.



Deixe seu comentário

Um pouco sobre nós

    O Grupo Dicas em Geral surgiu em 2007 a partir de idéias inovadoras sobre solução de problemas enfrentados diariamente por quem utiliza a Tecnologia e Informática, tanto usuários comuns quanto técnicos. Mas onde surgiu, por quê e qual é o propósito deste site?

Clique aqui e conheça!

Siga o Dicas em Geral no Google+

Vídeo da Semana