+2

Criando um script para download de imagens

criado por Leandro Maniezo em 24/12/2006 9:43pm
Crie um arquivo que será a página dos downloads, por exemplo "arquivo.php" com o seguinte conteúdo:

<?php
// le o tamanho do arquivo em bytes
$tamanho = filesize("$arquivo");

// pega extensão do arquivo
$ext = explode (".",$arquivo);

// aqui bloqueia downloads indevido
if ($ext[1]=="php") {
    echo "Arquivo não autorizado para download!";
}
 
// envia todos cabecalhos HTTP para o browser (tipo, tamanho, etc..)
header("Content-Type: application/save"); 
header("Content-Length: $tamanho");
header("Content-Disposition: attachment; filename=$nome.$ext[1]"); 
header("Content-Transfer-Encoding: binary");

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

Seu script está pronto! Para usar basta usar um link, como por exemplo o seguinte:

<a href="arquivo.php?arquivo=bola.jpe&nome=img_bola">Download Imagem</a>

Note que ao criar o link passei dois parâmetros que são "arquivo" e "nome". arquivo é o no me do arquivo no meu exemplo "bola.jpg". Já o parâmento nome é o novo nome do arquivo que vai ser gravado na máquina da pessoa que estiver fazendo o download, no meu exemplo fico img_bola.jpg, não precisa passar a extensão pois ele cria sozinho.

Não se esqueça que no meu exemplo eu considerei que a imagem bola.jpg estava no mesmo diretório que o arquivo.php. Se as imagens estiverem num outro diretório você terá que passar as pastas e níveis juntos.

Por motivo de segurança é legal que naquele if que só bloquei arquivo .php você habilite só arquivo que usará, se seu sistema de download será so para .jpg crie um if != "jpg".

Um boa utilização desse script seria para download de imagens fechado (logado), mais utilizado para quem vende imagems por exemplo. Basta colocar em um diretório as imagens com permissão de leitura só para root, e assim passar o link como acima por algum ambiente logado.

Abraço,
Leandro Maniezo
http://www.maniezo.com.br

Comentários:

Mostrando 1 - 10 de 15 comentários
Leandro Costa disse:
Gostaria de saber como fazer download de um arquivo pdf que já está no meu servidor.
07/01/2010 12:13pm (~15 anos atrás)

Matheus disse:
E como ficaria as pastas?

ao usar o fopen, usaria assim: fopen("pasta/$arquivo","r")?
ou na hora mesmo de pegar o arquivo? $arquivo = "pasta/$_GET["arquivo"]";

Aguardo respostas!
[]s



29/08/2009 3:09pm (~15 anos atrás)

é 'Trabulhao' e não 'Trambolhao' =D
26/07/2008 2:53pm (~16 anos atrás)

tem alguns erros bem pequenos que noobs não saberiam usar
mas o Trambolhao postou um código que funciona perfeitamente. Valeu Trambolhao! =)
26/07/2008 2:52pm (~16 anos atrás)

Lindberg S disse:
Este tutorial de Leandro é muito bom, estou aprendendo muito.
estou precisando de um script para baixar um arquivo texto,
estou pesquisando muito. Consegui fazer, mas ta aparecendo isso junto com o arquivo texto:

<br />
Warning: filesize()
[<a href='function.filesize'>function.filesize</a>]:
stat failed for texto.txt in
/home/restricted/home/rolefer/public_html/atualiza/at.php
on line 13<br />
linha 1 texto teste
linha 2 teste teste
linha 3 teste teste
linha 4 teste teste
linha 5 teste teste


não sei o que é
estas linhas de linha 1 ate a linha 5 acima são do arquivo texto

mas as linha antes não são, e não as quero.

Obrigado pessoal.
Mais uma vez.

13/05/2007 12:54pm (~17 anos atrás)

Victor Gondim disse:
Ola Leandro!

Nao querendo desmerece-lo, pelo contrario, mas apesar do seu aviso de que o script deve ser alterado, do jeito que ele foi postado esta totalmente inseguro... O cara pode pegar qualquer arquivo de qualquer pasta, desde que nao tenha extensao .php e que o apache tenha permissao para abri-lo, e a URL da todas as dicas de como faze-lo. Se um iniciante resolve apenas copiar o script sem ler a materia, o que é muito comum, provavlemente se dara mal. Temos que nos preocupar com quem vai ler a materia com pouco discernimento! Um abraço!
21/02/2007 5:04pm (~18 anos atrás)

Valew Rogério!
Boa dica mesmo, esqueci, segurança é uma coisa muito importante e que muitos desenvolvedores esquecem um pouco.

abs
13/02/2007 2:50am (~18 anos atrás)

Leandro, muito bom ter abordado esse assunto, pois muitas vezes precisamos desse scriptizinho e não temos "na manga". Quanto a filtrar pela extensão, é lógico que é necessário. Imagina o usuário manipulando a URL para baixar algum arquivo proibido.
A única coisa que eu acho que você pecou foi por não ter usado a superglobal $_GET ou $_REQUEST, mas tudo bem... ;)

Abraço!
13/02/2007 2:36am (~18 anos atrás)

Olá Marcos,

O filtro por extensão foi so um exemplo para segurança, imagine que sem esse filtro o usuario manipularia o arquivo a ser baixado e no caso um .php, ou seja ele ia ter os arquivos php do seu sistema e pior se ele tiver as estrutura de pasta usando um ../pasta ,etc.. ele pode até achar o arquivo que conecta com banco ou outros que possam ter dados sigilosos....

06/02/2007 2:29am (~18 anos atrás)

Marcos Regis disse:
Uma coisa que não concordo nesse script.
Validar arquivo pela extensão.

Pra que validar download pela extensão?
se é download é porque o arquivo já está no servidor e não há a necessidade de validar. Como ele chegou lá?
E se fosse pra validar (como seria o correto no upload) prefiro validar pelo tipo Mime.

pra pegar a extensão sem passar pelo problema citado pelo nosso amigo trambulhao (tu és portuga neh?)
o melhor codigo eh

$ext = preg_replace(".*\.(\w+$)","\\1",$filename);

ou se for apenas para validar se nao eh um .php

if (preg_match("\.php$",$filename)) {
echo "Arquivo não autorizado para download!";
}

05/02/2007 1:45pm (~18 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)