sexta-feira, 7 de maio de 2010

Enviar um ficheiro para o servidor

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 ficheiros para o servidor através de um formulário HTML. Qualquer tipo de ficheiro pode ser enviado para o servidor, seja ele uma imagem, um ficheiro de texto, uma base de dados, etc., ou melhor dizendo, seja o ficheiro binário ou texto.

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

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


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

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

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

upload_tmp_dir = - Qual o directório que onde o php guardará "temporariamente" o ficheiro enviado.

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

Normalmente o PHP já vem configurado para aceitar o upload de ficheiros, 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 ficheiro 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 ficheiro 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 ficheiro para ser enviado e pressionou o botão "Enviar ficheiro", se crias-te um ficheiro com o formulário acima e um ficheiro "teste.php" (pode ser o mesmo ficheiro do formulário) o browser do utilizador irá enviar o ficheiro para o servidor, e nada vai acontecer, além do php ter guardado o ficheiro no directório temporário e apagado o ficheiro no final da execução do script. Então teremos que fazer mais qualquer coisa com o ficheiro. Após receber o ficheiro, 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 ficheiro, baseadas no nome que escolhemos para o campo, no nosso caso "ficheiro":

$ficheiro : nome do ficheiro, com seu caminho absoluto, onde o php o guardou
$ficheiro_name : nome do ficheiro, absoluto, na máquina do utilizador
$ficheiro_size : tamanho em bytes do ficheiro
$ficheiro_type : tipo "MIME" do ficheiro


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

<?php
if($ficheiro_size > 1024) {
print "O tamanho do ficheiro é 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 ficheiro para o servidor e só depois serem avisados que o ficheiro era grande demais, assim o browser acusa o tamanho demasiado grande antes de enviar o ficheiro, e os utilizadores "espertinhos" terão uma decepção ao descobrir que existia outra limitação.

Precisamos agora fazer alguma coisa com o ficheiro antes de terminar o script, senão o php irá apagá-lo. Temos o nome do ficheiro na váriavel "ficheiro", 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 ficheiros, pois a função "copy" irá executar uma cópia do ficheiro 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 ficheiro 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 ficheiros. Supondo que o servidor tem permissão de escrita no subdirectório ficheiro do directório do nosso script, vamos gravar:

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


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

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

Em breve haverá um tutorial que explicará como fazer isto

Até a próxima!

0 comentários:

Postar um comentário

Proibido palavras ofensivas, racistas ou descriminatórias.

[Seu Comentário será liberado no máximo em 24horas]