Forçar download ao invés da exibição
17 de janeiro de 2008 - Por Rafael Jaques
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.
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
<?php $arquivo = 'curriculo.pdf'; exit; ?>
<?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
<?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!
PHP levado a sério