+1

Implementando um contador de downloads com PHP e MySQL

criado por Fábio Berbert de Paula em 06/07/2002 1:54pm
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:

<?php
$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);
?>

Comentários:

Mostrando 1 - 10 de 17 comentários
a esqueci de dizer o meu link esta assim

<a href='download.php?arquivo=".$linha['nome']."'><img border='0' src='img/down.png' width='20' height='20' alt='Baixar' /></a>

pois estou listando varios arquivos ai ele pega a linha pela id e da o nome do arquivo ai .. no browser ele ta postando certinho assim

<a href='download.php?arquivo=nome do arquivo.mp3'><img border='0' src='img/down.png' width='20' height='20' alt='Baixar' /></a>

tipo ta certinho n sei o q acontece. Me ajudem pleaseee.
19/01/2011 7:28pm (~14 anos atrás)

Ola meu script ficou assim
<?php
chdir('./musicas'); // entrar no diretório público

if (!is_file($arquivo)) { // se o arquivo não é arquivo ...
    echo "Erro: arquivo $arquivo não encontrado !";
    exit; // ... aborte o programa
}

require("conecta.php");

$consulta = "SELECT nome,down FROM musicas WHERE nome='$arquivo'";
$res = mysql_query($consulta,$conexao);

/*
  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 musicas SET down=$hit WHERE nome='$arquivo'";
    mysql_query($update,$con); // atualize o registro
} else {
    $insert = "INSERT INTO musicas (nome) 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-Type: application/octet-stream');
header('ContentType = audio/wav');
header('ContentType = audio/mpeg3');
header('ContentType = video/mpeg');
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);
?>

bom alterei a conexão com o DB .. apenas e os nomes de Tabela e de campos e tal .. mais ... no entanto esta td ok ...

mais ele nao ... adiciona ... ao meu banco de dados .. q foi feito mais 1 download

e nem ... faz o download

acrecentei tb ... mais headers apenas .. para garantir .. o down do tipo de arquivo q estou postando ... mais mesmo assim nao funfa nada

se alguem puder dizer em q estou errando agradeço :)

19/01/2011 7:25pm (~14 anos atrás)

O meu não deu certo ele diz q o arquivo não existe...
e está tudo certo, eu acho.
mudei apenas o diretório para "./arquivos" e naõ funcionou, vou tentar denovo do seu jeito..
09/06/2006 5:52am (~18 anos atrás)

Hm... Mas peraí. Se a variável arquivo tá sendo passada via GET para o script e lá ele recebe criando dinamicamente: $arquivo

Não tem uma grande falha nisso? Não seria melhor tratar a variável que vem de lá? Como por exemplo dar um explode pra saber se tem extensão. Porque a variavel ta sendo criada direto no script, nem verifica se ela vem vazia.

Mesmo sabendo que o script no inicio verifica se existe o arquivo, não seria possível burlar isto?

Ao criador, o que você faria pra implementar na hora de receber esta variavel? Ou você confia nesta forma globalzona?
20/08/2005 10:48am (~19 anos atrás)

Fred disse:
Como eu faço para limitar o número de registro na consulta. ex: minha tablela possui mais de 10.000 registro eu quero listar apenas os 100 registros que tiverem mais downloads e paginálos de 15 em 15, como segue abaixo.

"SELECT * FROM arquivos ORDER BY downloads DESC, nome LIMIT 0,15";

Valeu.
01/07/2005 12:11pm (~19 anos atrás)

Só 1 pergunta...

Como posso saber se o arquivo foi baixado com sucesso ?
05/11/2004 5:56pm (~20 anos atrás)

Felipe Sander disse:
Esquece que perguntei isso, já entendi.
21/01/2004 2:07pm (~21 anos atrás)

Felipe Sander disse:
Só serve pra contar 1 arquivo que está no diretório público?

E se eu quizer fazer este sistema pra vários arquivos, tenho que fazer 1 tabela pra cada um???
21/01/2004 1:53pm (~21 anos atrás)

Beto, a resposta está um pouco atrasada, talvez você já tenha encontrado a solução. De qualquer forma o que acontece é o seguinte: os headers devem ser a primeira coisa enviada para o browser. Verifique se o seu arquivos está mandando alguma coisa antes. Quanto ao código estranho que você cita acima não é nada mais do que a imagem do arquivo .exe que você está tentando fazer o download. Se você mandar os headers corretamente ele não aparererá mais.
12/10/2003 10:36pm (~21 anos atrás)

Em Netscape e Mozila o arquivo é salvo com extensão PHP.
Ex.:

nome do arquivo: teste.txt

nome sugerido: teste.txt.php

há como resolver?

PS: em Opera ele nem abre, o navegador simplismente exibe o conteúdo na tela

02/05/2003 9:51am (~21 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)