PHPit - PHP

"Agora, pois, permanecem a fé, a esperança, o amor, estes três; mas o maior destes é o amor." (I Coríntios 13:13)

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

ATENÇÃO: Este artigo está defasado, ou seja, pode apresentar uma ou mais falhas de segurança. Para visualizar sua versão aprimorada, clique aqui.
Caso MESMO ASSIM você deseje visualizar esta versão, clique aqui por SUA CONTA E RISCO.

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.

Código: Alternar entre o modo de cópia/destaque
  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. ?>
<?php
    $arquivo 
'curriculo.pdf';
    
header ("Content-type: octet/stream");
    
header ("Content-disposition: attachment; filename=".$arquivo.";");
    
header("Content-Length: ".filesize($arquivo));
    
readfile($arquivo);
    exit;
?>


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:

Código: Alternar entre o modo de cópia/destaque
  1. <?php
  2. $arquivo = $_GET['arquivo'];
  3. if (!file_exists($arquivo))
  4.  
  5. header ('Content-type: octet/stream');
  6. header ('Content-disposition: attachment; filename='.$arquivo.';');
  7. header ('Content-Length: '.filesize($arquivo));
  8. readfile($arquivo);
  9. ?>
<?php
    $arquivo 
$_GET['arquivo'];
    if (!
file_exists($arquivo))
        exit;

    
header ('Content-type: octet/stream');
    
header ('Content-disposition: attachment; filename='.$arquivo.';');
    
header ('Content-Length: '.filesize($arquivo));
    
readfile($arquivo);
    exit;
?>


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!

Dim dim

 

Comentaí! (10)

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 Xorna em 17/01/2008 às 07:31 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.11 no Windows Windows Vista
Bah, não sabia que dava pra fazer um troço desses. Legal até :)

Mas eu prefiro zipar :P

Tri massa, abraço! André em 17/01/2008 às 15:27 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.11 no Windows Windows Vista
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 Diogo em 21/01/2008 às 18:17 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.11 no Windows Windows Server 2003
ahhh... acabei de usar essa megarotina =) Xorna em 04/02/2008 às 10:04 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.11 no Windows Windows XP
amigo!! mas vc tá chique ein?!
fui procurar isso no google e qual site que apareceu? phpit!
saudações candangas! Prinity em 09/04/2008 às 15:43 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.11 no Windows Windows 2000
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 Luiz F. G. Deitos em 21/05/2008 às 16:44 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.12 no Windows Windows XP
amigao,

no internet explorer NAO FUNCIONA

coloca isso no seu artigo william em 22/01/2009 às 10:21 utilizando o Mozilla Firefox Mozilla Firefox 3.0.5 no Windows Windows Vista
Funciona sim...

Mas no IE5 e IE6 ele põe o nome de arquivo errado..


Tenta o novo script! :) Rafael Jaques em 22/01/2009 às 10:36 utilizando o Mozilla Firefox Mozilla Firefox 3.0.5 no Mac OS Mac OS X
Massa muito massa!!! Marcelo Santos em 01/02/2009 às 11:21 utilizando o Mozilla Firefox Mozilla Firefox 3.0.5 no Ubuntu Linux Ubuntu Linux
Cara, faço as palavras do xorna as minhas! me obriguei a procurar isso agora, eonde achei :b hehehe

vlw Jason em 25/08/2010 às 10:29 utilizando o Mozilla Firefox Mozilla Firefox 3.6.8 no Windows Windows NT
 

Comenta logo, pô!

* Todos os links inseridos nos comentários possuem rel="nofollow" para impedir com que crawlers considerem os mesmos como relevantes.
* Os e-mails não são divulgados.

Dados pessoais

Você é realmente um humano?

Finalmente, digite seu comentário :)

Caixinha de Sugestões

O que é isso? Aqui você pode simplesmente digitar uma sugestão (artigos, resenhas, melhorias, etc) sem precisar preencher longos formulários. Digite o que quiser na caixinha abaixo e eu lerei com o maior prazer! Se quiser se identificar, fique a vontade!

O PHPit é redigido e mantido por Rafael Jaques - Política de Privacidade.

XHTML/CSS desenvolvido por André Gazola.

PHPit 2007 - 2009 - Alguns direitos reservados.

Feeds ;)

Creative Commons License

PHPit por Rafael Jaques é licensiado sob a Creative Commons Atribuição-Uso Não-Comercial-Compartilhamento pela mesma Licença 2.5 Brasil License.