Conheça o Plugfeed | » Início » Programação » PHP » Como forçar o download de um arquivo em PHP
Conheça o Plugfeed | » 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).


Como forçar o download de um arquivo em PHP

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));

rocky
Esse erro na linha 12 é um bug do código, falta um ";" (terminação de linha) na linha anterior.
Quanto ao script até era bom se não tivesse o problema de segurança, pois como ja foi dito, com este código é possivel fazer o download de qualquer ficheiro que esteja hospedado no servidor.
Ehinarr <ehinarr@msn.com>
Testei para baixar um .php, mas ele continua tentando ler antes de baixar. Poderia funcionar com qualquer extensão.
Adir Renato <adirenato@hotmail.com>
Muito bomm... me quebrou um baita galho aqui na empresa. Obrigado
Sérgio Gomes <ser.edu.sjc@hotmail.com>
Cara, vc solucionou um problemão pra mim! Eu estava tendo muita dificuldade para fazer uma pg de download de músicas mp3 nos sites dos meus clientes e esse script resolveu perfeitamente! Muito grato! Parabéns!
Ola Amigo, Parabéns pelo script, excelênte...
Diego Fernandes Bernardo <diego@diegowebdesigner.net>
Olá.Estou procurando por esse código ja faz um tempo,mas infelizmente está dando erro.
Quando clico para fazer o download,aparece a seguinte mensagem:
Parse error: syntax error, unexpected T_STRING in /home/diegoweb/public_html/download.php on line 7

Fiz do seguinte modo:apliquei o link <a href=download.php?file=arquivo.pdf>Arquivo</a> sendo que,onde está arquivo.pdf coloquei o nome do arquivo(manual_clorador.pdf) e onde está Arquivo,coloquei a figura onde é clicada para ser feito o download.Depois criei a página php com o código q vc forneceu.Tentei mudar a seguinte linha:
header("Content-Length:".filesize(file)); onde está filesize, deixei size e mesmo assim não foi.Vi que é exatamente esse código que preciso,porém,pelo q notei,o erro está nessa linha.Poderia me ajudar?
Desde já,obrigado
tenho uma pagina download.php
que busca no banco de dados o caminho do arquivo pdf, e lista na tela todos o arquivos junto com o icone.
<a href="funcao.php?funcao=download&id=<? echo id ?>">Download</a> </center>

como eu coloco este script para que funcione,já fiz varias tentativas e nada
agradeço des jà.
Caro amigo, muito boa a ua iniciativa de esvrever esse codigo, coloquei o mesmo na minha plicação, porem alguns arquivos .pdf não abrem após o downloads, mesmo estando normal antes, podes me dier se tem algo de erraedo, a parte de downloads do arquivo é exatamente como o seu. Grato
Sem comentarios

Visite www.paginicial.rg3.net
qwerty
Gostei e ja estou utilizando este script para forçar o download, mas gostaria de saber se é possivel ele enviar direto para um determinada pasta no micro do cliente sem abrir a caixa solicitando para que o usuario confirme o download tente que clicar no botão salvar? pode ser enviado sem aparecer esta caixa de confirmação e ir para uma pasta especifica? se tiver como pode me passar o codigo?
Obriado