|
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!
|