
15/01/2005 - Fazendo uma enquete simples com arquivos texto
28/01/2003 - IIS no WinXP Home
09/02/2003 - Artigo Arrays II
13/04/2006 - Page Rank Google - E Mapas de Site em Html com Links
07/12/2003 - Flash e as mudanças do IE
09/01/2003 - Sistema de Banner Rotativo
08/04/2006 - Oracle Database 10g Release 2
07/02/2003 - Criando uma conexão usando provider
25/04/2004 - A cultura erronea dos bits
07/12/2003 - Compacte bancos de dados MDB pelo ASP/VBS script
21/04/2003 - instalação da classe FastTemplate
17/09/2007 - Efeito Revista Em Quadrinhos
28/01/2003 - Instalando Plug-ins
01/03/2003 - Enviando email em formato HTML em PHP
Leituras: 21226 -
Introdução
A idéia de criar um contador de downloads surgiu quando quis medira popularidade dos scripts que disponibilizava em meu web site. Com certeza a curiosidade é o que faz evoluir qualquer programador, eu não fazia idéia sobre como começar o programa.
Precisei descobrir como o servidor web forçava o browser do usuário a abrir uma janela para salvamento de arquivo e para isso foram gastas algumas horas lendo a RFC do protocolo HTTP. Depois de descoberto esses pequenos detalhes, foi bem tranqüilo finalizar o script.
Resolvi escrever este artigo pois sei da utilidade do script e também sei como é difícil iniciar sua programação à partir do zero, sem nenhum ponto de referência.
Neste artigo não vou me aprofundar no gerenciamento do MySQL, vou partir do princípio que você é capaz de criar a tabela usada no script
.
Criação do banco de dados
Antes de iniciarmos a programação do script, vamos preparar seu ambiente de execução. O primeiro passo será o de criar o banco de dados que será acessado pelo script. Assumindo que você já esteja conectado ao shell do MySQL, vamos à seguinte seqüência de comandos:
mysql> create database phpdownload;
Query OK, 1 row affected (0.06 sec)mysql> connect phpdownload;
Connection id: 158
Current database: phpdownloadmysql> CREATE TABLE contador (
-> arquivo VARCHAR(100) PRIMARY KEY NOT NULL,
-> hits INT DEFAULT 1
-> );
Query OK, 0 rows affected (0.12 sec)
Nas linhas acima, criamos o banco de dados phpdownload e em seguida a tabela contador, que será usada para armazenar o nome do arquivo e o número de vezes que ele foi clicado. Em seguida, vamos criar um usuário no banco de dados que será usado pelo script para se conectar ao MySQL:
mysql> GRANT ALL PRIVILEGES ON phpdownload.* TO phpdown@localhost
-> IDENTIFIED BY 'uaubaby' WITH GRANT OPTION;
Query OK, 0 rows affected (0.12 sec)mysql> flush privileges;
Query OK, 0 rows affected (0.17 sec)
Elaborando o script
Neste exemplo, criei um diretório central onde estarão armazenados todos os arquivos disponíveis para download no site. Se quiser seguir outro padrão,basta adaptar o script que será apresentado. Sendo assim, no mesmo diretório onde será encontrado o programa download.php existe um diretório com o nome publico.
Nosso programa sempre receberá um argumento, o nome do arquivo que está dentro do diretório publico. O primeiro bloco de código vai entrar neste diretório e verificar se o arquivo solicitado existe:
<?
chdir('./publico'); // entrar no diretório públicoif (!is_file($arquivo)) { // se o arquivo não é arquivo ...
echo "Erro: arquivo $file não encontrado !";
exit; // ... aborte o programa
}
?>
Agora que sabemos que o arquivo existe, vamos conectar ao banco de dados e adicionar um hit ao número de vezes que clicaram sobre o mesmo.
<?
$con = mysql_connect('localhost','phpdown','uaubaby');
mysql_select_db('phpdownload');$consulta = "SELECT arquivo,hits FROM contador WHERE arquivo='$file'";
$res = mysql_query($consulta,$con);
/*
certificar se o arquivo já foi clicado alguma vez. Se o arquivo ainda
não consta em nossa tabela, vamos inserir um novo registro, caso contrário
vamos somar um hit ao registro existente
*/if ($saida = mysql_fetch_array($res)) { // registro existe
$hit = ++$saida[1]; // some 1 (um) ao número de cliques
$update = "UPDATE contador SET hits=$hit WHERE arquivo='$arquivo'";
mysql_query($update,$con); // atualize o registro
} else {
$insert = "INSERT INTO contador (arquivo) VALUES ('$arquivo')";
mysql_query($insert,$con); // insira o novo arquivo na tabela. O valor padrão
// de hit é 1 (um)
}
?>
Agora que já fizemos todo o processamento necessário, vamos enviar o arquivo em forma de stream binário para o navegador do usuário:<?
$tamanho = filesize($arquivo); // pega o tamanho do arquivo em bytes// enviar os cabeçalhos HTTP para o browser
header("Content-Type: application/save");
header("Content-Length: $tamanho");
header("Content-Disposition: attachment; filename=$arquivo");
header("Content-Transfer-Encoding: binary");// abrir e enviar o arquivo
$fp = fopen("$arquivo", "r");
fpassthru($fp);
fclose($fp);
?>
Viram só, um contador de download não é nenhum bicho de sete cabeças. Vamos juntar nossas partes do programa e mostrar a versão final do script:<?
chdir('./publico'); // entrar no diretório públicoif (!is_file($arquivo)) { // se o arquivo não é arquivo ...
echo "Erro: arquivo $file não encontrado !";
exit; // ... aborte o programa
}$con = mysql_connect('localhost','phpdown','uaubaby');
mysql_select_db('phpdownload');$consulta = "SELECT arquivo,hits FROM contador WHERE arquivo='$arquivo'";
$res = mysql_query($consulta,$con);
/*
certificar se o arquivo já foi clicado alguma vez. Se o arquivo ainda
não consta em nossa tabela, vamos inserir um novo registro, caso contrário
vamos somar um hit ao registro existente
*/if ($saida = mysql_fetch_array($res)) { // registro existe
$hit = ++$saida[1]; // some 1 (um) ao número de cliques
$update = "UPDATE contador SET hits=$hit WHERE arquivo='$arquivo'";
mysql_query($update,$con); // atualize o registro
} else {
$insert = "INSERT INTO contador (arquivo) VALUES ('$arquivo')";
mysql_query($insert,$con); // insira o novo arquivo na tabela. O valor padrão
// de hit é 1 (um)
}
$tamanho = filesize($arquivo); // pega o tamanho do arquivo em bytes// enviar os cabeçalhos HTTP para o browser
header("Content-Type: application/save");
header("Content-Length: $tamanho");
header("Content-Disposition: attachment; filename=$arquivo");
header("Content-Transfer-Encoding: binary");// abrir e enviar o arquivo
$fp = fopen("$arquivo", "r");
fpassthru($fp);
fclose($fp);
?>
Para usar o mesmo, sempre que for criar um link para download, copie o arquivo para o diretório ./publico e defina a referência para./download.php?arquivo=nome_do_arquivo:Conclusão: uau, isso é mais divertido que tomar sorvete no shopping !
Atenciosamente,
Fábio Berbert de Paula
fabio@vivaolinux.com.br
Fonte:www.vivaolinux.com.br