Upload de arquivos usando formulário html e PHP
O PHP suporta várias funcionalidades, por isso o seu grande sucesso entre os desenvolvedores que buscam facilidade de programação, suporte a banco de dados,
independência de sistema operacional e hardware, entre outros.
Dentre as 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 texto, um banco de dados, etc., ou melhor dizendo, seja o arquivo binário ou texto.
Para enviar o arquivo, primeiro precisamos criar um formulário para o usuário indicar qual arquivo ele deseja mandar:
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 corretamente no php: file_uploads = On ; O PHP aceita o envio de arquivos (padrão) upload_tmp_dir = ; Qual o diretório que o php guardará “temporariamente”; o arquivo enviado. O padrão é deixar esta configuração; “comentada”, assim o php usará o diretório do sistema; operacional para arquivos temporários upload_max_filesize = 2M ; Tamanho máximo do arquivo aceito pelo php
Normalmente o PHP já vem configurado para aceitar arquivos, mas é sempre bom checar sua configuração (php.ini) para não ter dores de cabeça depois.
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 limitando 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 eu mostrarei outra solução para isso.
….
Tudo bem, o usuário selecionou o arquivo para ser enviado e pressionou o botão “Enviar Arquivo”, se você criou um arquivo com o formulário acima e um arquivo “teste.php” (pode ser o mesmo arquivo do formulário) o browser do usuário irá enviar o arquivo para o servidor, e nada vai acontecer, além de o php ter guardado o arquivo no diretório temporário e apagado o arquivo ao final da execução do script. Então teremos que fazer algo com o arquivo, ou então teremos vários usuários zangados. Após receber o arquivo, o php irá guardar ele num diretório temporário, com um nome que ele mesmo escolheu, e criará para nós várias variáveis globais com informações deste arquivo, baseado no nome que escolhemos para o campo, no nosso caso um nome bem criativo, “arquivo”:
$arquivo : nome do arquivo, com seu caminho absoluto, que foi guardado pelo php
$arquivo_name : nome do arquivo, absoluto, na máquina do usuário
$arquivo_size : tamanho em bytes do arquivo
$arquivo_type : tipo “MIME” do arquivo
Com posse dessas variáveis podemos agora fazer qualquer coisa com o arquivo. Podemos, por exemplo, verificar se o arquivo tem um tamanho abaixo do limite que queremos que os usuários enviem ao servidor (você não quer seu servidor com o disco entupido de arquivos gigantes de usuários, quer?). Usamos em nosso script:
if($arquivo_size > 1024) {
print “O tamanho do arquivo é maior que limite permitido
“;
exit;
}
?>
Para não deixar alguns usuário irritados, podemos usar as duas opções juntas, o limite configurado dentro do formulário e o limite dentro do script, assim os usuários normais não terão a decepção de esperar vários minutos para enviar o arquivo para o servidor e só depois ser avisado que o arquivo era grande demais (o browser dele vai reclamar antes de enviar o arquivo sobre o tamanho do mesmo), e os usuários “expertinhos” 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á excluir ele. Temos o nome do arquivo na variável “arquivo”, então precisamos colocar ele em algum lugar no 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 esse método em um sistema Linux, unix ou qualquer outro que tenha suporte a permissão de arquivos, pois a função “copy” irá executar uma cópia do arquivo como o usuário que executa o servidor web, portanto, se o usuário/grupo que executa o servidor web não tiver permissão de escrita no diretó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 usuários, ou dê a permissão em algum diretório específico somente para gravar os arquivos. Supondo que o servidor tenha permissão para escrita no subdiretório arquivos do diretório do nosso script, vamos gravar:
....
if(copy($arquivo,"arquivos/arquivo_do_usuario")) {
print "O arquivo foi recebido com êxito!
“;
} else {
print “Ocorreu um erro ao tentar receber o arquivo!
“;
}
?>
Pronto, agora o arquivo foi salvo como arquivo_do_usuario no subdiretório arquivos. Note que todos os usuários que enviarem arquivos para o servidor terão seus arquivos salvos com o mesmo nome, portanto, somente um arquivo irá existir, e será o arquivo do último usuário que enviou o arquivo. (É, que envia por último envia melhor
). Ainda teremos vários usuários irritados.
Deixo para o leitor o exercício de criar um arquivo único para cada usuário e que um mesmo usuário não consiga enviar mais de três arquivos por login.
Categorias
- Categories
Páginas
Links Interessantes