Conheça também: Onmasters . Ofertas . Divulgue! . Vai.la . Geraboleto . Baixa.la . Assista.la . Joga.la
» Início » Programação » PHP » Como forçar o download de um arquivo em PHP -->
 
Avaliação: | Publicado em: 30/11/2006
Como forçar o download de um arquivo em PHP
Oberaldo Bull Programador PHP/MySql, trabalho no desenvolvimento de sites e sistemas dinâmicos. Faço parte da EquipeXQ de programadores, administro o site nacional do framework CakePHP (www.cakephp.com.br).


Veremos agora, como forçar o download de um arquivo, passando parâmetros de uma página a outra.

Tutorial Editado devido problemas para fazer o download no navegador IE.

Como exemplo, imagine que você tem uma página com um link para um arquivo PDF, e normalmente, ao clicarmos neste tipo de arquivo, ele não nos dá a opção de salvá-lo, abrindo automaticamente.

Para que isto não ocorra, utilize o código a seguir, para forçar o download do arquivo.

Em uma página.html, insira o link desta maneira:

<a href=download.php?file=arquivo.pdf>Arquivo</a>

Agora, o código da página que irá forçar o download
download.php

<?php
$file = $_GET['file']; // pega o endereço do arquivo
// ou o nome dele se o arquivo
// estiver na mesma pagina!!


header("Content-Type: application/save")
header("Content-Length:".filesize($file));
header('Content-Disposition: attachment; filename="' . $file . '"');
header("Content-Transfer-Encoding: binary");
header('Expires: 0');

header('Pragma: no-cache');

// nesse momento ele le o arquivo e envia
$fp = fopen("$file", "r");
fpassthru($fp);
fclose($fp);

?>

Espero que seja útil para vocês.
Obrigado e até o próximo artigo!

Artigos relacionados
Este artigo é a parte 3 de 4 da seguinte série:

cara gosto muito, legal mesmo, to gostado muito dos seus artigos pq é simples para mim aprender, obrigado por isso espero mais :D
Acelio Filho <acelio@floripasom.com>
Nunca tinha prestado muita atenção no ´header´ e nem sabia que existia: ´application/save´

Uma graaaaande foooorça... Valeu...

acrescento um código pra fazer uma comparação entre ler e baixar o arquivo
<cod>
<pre>
&lt;?php
if(_GET'file'==&quot;&quot; _GET'file'==NULL)
{ print&quot;&lt;a href=&quot;download.php?file=arquivo.pdf&quot;&gt;Copiar
Arquivo&lt;/a&gt;&quot;;
print&quot;&lt;hr&gt;&lt;a href=&quot;arquivo.pdf&quot;&gt;Ler Arquivo&lt;/a&gt;&quot;;
}else{
file = _GET'file'; // pega o endere&ccedil;o do arquivo
// ou o nome dele se o arquivo
// estiver na mesma pagina!!
header(&quot;Content-type: application/save&quot;);
header(&quot;Content-Length:&quot;.filesize(file));
header('Content-Disposition: attachment;
filename=&quot;' . file . '&quot;');
header('Expires: 0');
header('Pragma: no-cache');
readfile(&quot;file&quot;);
}
?&gt;
<pre>
</cod>
Muito bom o seu trabalho cara! gostei mto...coisas simples mais q sao muito boas!!!
Só funciona corretamente no Firefox.
No IE ele mostra como download o attachent o arquivo download.php.
Voce então precisa renomear o arquivo forçando o tipo de acordo com o arquivo q está sendo baixado. Do contrário ele salva como download.php... Alguém sabe o porquê disso?
Cuidado com o emprego deste Script.

Veja este link sobre segurança
http://forum.wmonline.com.br/index.php?showtopic=169672
NandoGyn
muito bom me serviu muito estava procurando a muito tempo
Anderson Caparróz <andersoncaparroz@gmail.com>
ISTO É UM CRIME A SEGURANÇA DE SEUS SITES

Imaginemos por exemplo que o arquivo chamado DOWNLOAD.PHP , esteja em uma determinada pasta chamada DOWNLOADS de seu site , e nesta pasta estejam também os arquivos que vc. gostaria de disponibilizar aos usuários de seu site.

o objetivo , que era disponibilizar o arquivo EXEMPLO.DOC para download através da url:
www.seusite.com.br/downloads/download.php?file=exemplo.doc
transforma-se na porta de entrada para vasculharem seus scripts php em busca de senhas , nomes de tabelas de Banco de dados entre outras importantes informações que não gostariamos de tornar publicas.

como ?!?!

com a simgela URL abaixo
www.site.com.br/downloads/download.php?file=../index.php
o usuário mal intencionado terá acesso ao seu script index.php ao invés do arquivo exemplo.doc ,.. e por ae vai .....
mt bom cara... meus parabéms...
legal =
nâo testei ainda o script e preciso muito de um, e agora os caras entram aqui e dizem que não é seguro e tals, moçada, entao posta um como deve ser e para com isso, fica com a impressão de que tão só de sacanagem com o autor do script...abraço a todos! : Não avaliado
Bom seu script!! mas se eu quero forçar o download de arquivos com extensões diferentes???
Jorge Fieza <jmfieza@gmail.com>
povo,
basta vcs aliarem este código à um banco de dados.

www.seusite.com.br/download.php?id=1

aí ele busca num banco de dados o endereco que está escrito lá.
e substitui no codigo.


flwz.
Cara, a ideia é muito legal mas a falha de segurança é enorme! Da pra baixar os fontes todos do site assim! Rola nao...
Apenas uma dúvida. O seu programa está perfeito, forçando qualquer arquivo para download... porem como faço para fechar a janela que lê o arquivo, pois abra a tela de dialago com o cliente para salvar mas a o browser fica por traz aberto como faço para fechar essa janela, já tentei javascript e nada! Desde já agradeço.
Rubens Designer <rubensd7@hotmail.com>
muito show!
Rodrigo Mamede <rodrigomamedep@hotmail.com>
Rapaiz... horas de noites mal dormidas economizadas...

Valeu mesmo!
muuuuuito bom, maravilha o script, me ajudou bastante!!!
Oberaldo Forçar download é baixar de sites de html php por exemplo de um site que vende musicas baixar de graça? É isso? Tô aprendendo
Luis Henrique Weirich de Matos <luisweirich@gmail.com>
O código realmente soluciona o problema de forçar o download.
Mas o problema de segurança existe.
Este código permite acesso sobre arquivos que não possam ser revelados. Por exemplo: Arquivo que guarde host, login e senha do banco de dados.

Para solucionar este problema aconselho condicionar o download. Mas como?

É simples! Basta limitar o download para arquivos de uma extensão especifica, como pdf, ou limitar um diretório especifico, como /docs_pdf/.

Ok?

See You!!!
Caio Fernandes <augcaio@gmail.com>
Excelente simples e prático
Olá para fazer downloads do mesmo host ele faz

mais não força download de arquivos outro servidor ?
como devo proceder neste caso ?

obrigado.
Nathan Costa <ntmk3cta@hotmail.com>
Testei o seu código e quase funcionou 100%. Não sei pq o arquivo que faço download vem com o conteúdo alterado. Ele coloca o conteúdo da página html no início do arquivo. Se vc tiver alguma dica pra me ajudar, eu fico ainda mais agradecido.
's
vitor hugo silva <vitorhugo83@gmail.com>
Muito bom o script, mas ao testa-lo na nova versão do internet explorer nao funcionou, deve ser alguma politica de segurança nova. Ele baixa o download.php ao inves do arquivo. abraços!
vitor hugo silva <vitorhugo83@gmail.com>
Muito bom o script, mas ao testa-lo na nova versão do internet explorer nao funcionou, deve ser alguma politica de segurança nova. Ele baixa o download.php ao inves do arquivo. abraços!
Olá Vitor Hugo,
Agora o script funciona também no IE, bug corrigido, obrigado!
Em vez de gravar um arquivo no computador local, ele mostra no browser... Tem algum jeito de forçar a gravaçao do download no computador local a partir de um arquivo do servidor... Obrigado.
xD <=)>
tem como trazer os codigos php junto na hora de baixar ???
<?php?>

vlw...
Muito bom!

________________________

Hospedagem de sites apartir de 4,99 e Registros de Domínios Apartir de 24,99!

http://www.focushost.com.br - suporte@focushost.com.br
Wilson S. Franca <wsfranca@gmail.com>
Fico muito grato pela disponibilização da informação, estava necessitando de uma solução destas e foi de cheio a serventia. Obrigado.
ocorreu o seguinte error:
Parse error: syntax error, unexpected T_STRING in C:Arquivos de programasVertrigoServwwwdownload.php on line 12

esta é a linha 12:
header("Content-Length:".filesize(file));