BuscaPé, líder em comparação de preços na América Latina

PHPit

Pular navegação

Forçar download ao invés da exibição

Enviado em 16/01/2008 às 18:25

Conceito


Muitas vezes, disponibilizamos em nossos sites coisas como imagens, pdfs, arquivos html ou qualquer outro tipo de arquivo que o navegador consiga abrir diretamente. Às vezes não é exatamente isso que queremos. Um PDF que abre no navegador pode tornar-se um grande inconveniente, já que deixa todo o computador lento...

Hoje iremos aprender como forçar um arquivo a ser baixado sem ter que zipa-lo. :P

Mão na massa


A rotina é simples e objetiva. A idéia é indicar para o navegador que o arquivo deve ser baixado e, em seguida, enviar todo o conteúdo para o buffer de saída.

  1. <?php
  2. $arquivo = 'curriculo.pdf';
  3. header ("Content-type: octet/stream");
  4. header ("Content-disposition: attachment; filename=".$arquivo.";");
  5. header("Content-Length: ".filesize($arquivo));
  6. readfile($arquivo);
  7. exit;
  8. ?>


Sendo assim, acessando o arquivo com o código acima, será efetuado o download de "curriculo.pdf".

Outro modo de fazer seria com o nome da arquivo variável, sendo passado por GET:

  1. <?php
  2. $arquivo = $_GET['arquivo'];
  3. if (!file_exists($arquivo))
  4. exit;
  5.  
  6. header ('Content-type: octet/stream');
  7. header ('Content-disposition: attachment; filename='.$arquivo.';');
  8. header ('Content-Length: '.filesize($arquivo));
  9. readfile($arquivo);
  10. exit;
  11. ?>


Digamos que temos que salvar este arquivo como "download.php", um link para baixa ro arquivo anterior ficaria desta maneira.

<a href="download.php?arquivo=curriculo.pdf">Clique para baixar o curriculo</a>


É bem simples e funcional. Note que você deve ter os arquivos para download no mesmo diretório que o arquivo PHP. Caso estejam em diretórios diferentes, você deve especificar isto no código.

Atenção!


Se você testar este código no Internet Explorer 6 e não aparecer nome do arquivo na hora de baixar, ou seja, aparecer o nome do script (Ex.: download.php), você deve apenas remover a linha que envia o header "Content-type: octet/stream" e tudo deverá estar resolvido!

Conclusão


Nem sempre tudo que parece, é. As vezes um problema qua aparenta ser imenso, pode ser resolvido de uma maneira muito fácil. O ser humano é que tende a complicar o que é simples.

Despeço-me desejando a todos um ótimo ano e aguardando sugestões para mais artigos!
Um grande abraço e fiquem com Deus!

 

Comente (06)




Comentário #1
Autor: Xorna
Em: 17/01/2008 às 07:31

Cara, show de bola esse artigo, essa era uma dúvida que eu tinha, mas por falta de vontade sequer fui atrás, mas agora todos sabemos... graças ao tio rafa =)

parabéns!

abraço

Comentário #2
Autor: André
Em: 17/01/2008 às 15:27

Bah, não sabia que dava pra fazer um troço desses. Legal até :)

Mas eu prefiro zipar :P

Tri massa, abraço!

Comentário #3
Autor: Diogo
Em: 21/01/2008 às 18:17

Opa...

Parabens pelo site.
Certamente vai ajudar muita gente q ta comecando e tb os q nao sao muitos estudiosos (como eu) hehe

abcs,

Diogo Lopes

Comentário #4
Autor: Xorna
Em: 04/02/2008 às 10:04

ahhh... acabei de usar essa megarotina =)

Comentário #5
Autor: Prinity
Em: 09/04/2008 às 15:43

amigo!! mas vc tá chique ein?!
fui procurar isso no google e qual site que apareceu? phpit!
saudações candangas!

Comentário #6
Autor: Luiz F. G. Deitos
Em: 21/05/2008 às 16:44

Olá...

Conheço seu site atravéz d um camarada meu, o Carlos (souweb.info)...
gostei muito do artigo,

porém gostaria de fazer uma pergunta,,
ñ tenho la muita noção de segurança e tal...

mas supomos que alguém insira o link:
<a href="download.php?arquivo=../index.php">

ou então

<a href="download.php?arquivo=../conecta_bd.php">

se esse comando funcionar como "teoricamente" funcionaria, ñ comprometeria a segurança do site?

aguardo resposta!,, um abraço

Artigos Recentes

Rafael Jaques - PHPit 2007
Site sob Creative Commons - Alguns direitos reservados

Assine o RSS do PHPit! :)
Saiba onde tem o melhor preço antes de comprar