Oferta Nacional - 234x60

Arquivo

Textos com Etiquetas ‘salvar como’

Salvar como em php – download de arquivos

Olá!

Neste post vou mostrar como salvar arquivos usando PHP. Esta funcionalidade serve para que os arquivos disponibilizados em seu site tenha um link que ao ser clicado, apareça a janela “Salvar como…”.

Seguindo este tutorial, você será capaz de montar um arquivo que recebe parâmetros em GET e depois chama uma função para setar os cabeçalhos dizendo que o arquivo é para download. A vantagem é que você vai criar esse arquivo apenas uma vez, e poderá replicar para todos os links de download do seu site. A funcionalidade detectará automaticamente o mime type do arquivo. Mãos às obra!

Primeiro, vamos criar o arquivo download.php.


<?php
if( isset( $_GET['arquivo'] ) && is_file( $_GET['arquivo'] ) ){
 
 $arquivo = $_GET['arquivo'];
 
 // Pega a extensão do arquivo
 $ext = pathinfo($arquivo,PATHINFO_EXTENSION);
 
 // No vetor abaixo são setados os Mime Types dos possíveis arquivos
 $mimeType = array(
 'mp3'=>'audio/mpeg',
 'pdf'=>'application/pdf',
 'doc'=>'application/msword',
 'ppt'=>'application/vnd.ms-powerpoint',
 'pps'=>'application/vnd.ms-powerpoint'
 );
 
 //Seta o Mime Type do arquivo de acordo com a extensão
 if(array_key_exists($ext,$mimeType)){
 $mimeType = $mimeType[$ext];
 }else{
 // Se o Mime Type não for encontrado na lista, será usado o padrão application/octet-stream
 $mimeType = "application/octet-stream";
 }
 
 // Seta os cabeçalhos
 header( "Pragma: public" );
 header( "Expires: 0" );
 header( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
 header( "Cache-Control: private",false );
 header( "Content-Type: $mimeType" );
 
 // A linha abaixo é responsável por dizer que o arquivo é para download
 header( "Content-Disposition: attachment; filename=\"".basename($arquivo)."\";");
 
 header( "Content-Transfer-Encoding: binary" );
 header( "Content-Length: ".filesize($arquivo));
 
 // Lê e escreve o conteúdo do arquivo para o buffer de saída
 readfile($arquivo);
 
 exit;
} else {
 // Para dar um erro 404 de arquivo não encontrado
 header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
 header("Status: 404 Not Found");
 
 // Se as duas linhas acima não der um erro 404 exibe a mensagem abaixo
 die("Arquivo não encontrado");
}
?>

Agora vamos criar o arquivo que conterá o link de download de um arquivo de exemplo (exemplo.html):


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Exemplo de download e arquivo</title>
</head>
<body>
<h1>Exemplo de download de arquivos com opção "Salvar como"</h1>
<b>meu_arquivo.mp3</b> <a href="download.php?arquivo=meu_arquivo.mp3">Clique para fazer o download</a>
</body>
</html>

Pronto!

Agora rode o arquivo exemplo.html e clique no link “Clique para fazer o download” e aparecerá a janela “Salvar como…” para fazer download do arquivo!

Lembrando que o arquivo deve estar no mesmo diretório que o arquivo download.php, ou então você deverá passar também o caminho do arquivo ;) .

Uma dica: se você quiser uma lista de mime types de arquivos, acesse http://www.mimetype.org/.

Deixe seu comentário!

Até a próxima!

Posts Relacionados:

Forçar download em servidor remoto como Amazon S3 com opção “salvar como”

Olá!

Este artigo mostra como fazer para que apareça a opção “salvar como” para downloads de arquivos hospedados em servidores remotos, o que é muito útil para se poupar recursos do servidor.

Para poder utilizar a solução apresentada aqui, será necessário que o Apache esteja com os módulos mod_rewrite e mod_proxy habilitados, ou que você possa editar o arquivo httpd.conf do servidor Apache (ou solicitar as configurações ao seu serviço de hospedagem).

Há um certo tempo atrás a equipe do meuInglês decidiu hospedar os arquivos pesados do site, como FLV e MP3, e as imagens, nos servidores Amazon S3. As vantagens eram muitas, tais como a rapidez no carregamento dos arquivos, o baixo custo e a segurança envolvidos. Tudo era maravilhoso, até que esbarrei com as opções de download que o meuInglês oferece aos seus usuários. Outros sites concorrentes também hospedam seus arquivos na Amazon S3, e a opção de download para seus usuários é de clicar com o botão direito do mouse para selecionar salvar o destino do link (pelo menos com instrução, para facilitar a vida de usuários menos experientes).

Particularmente, acho esta solução muito deselegante, pois é tão cômodo para o usuário simplesmente clicar no botão de download e aparecer uma janelinha pedindo para “Salvar o arquivo como…”. Comecei a googlar pesquisando uma solução.

A primeira coisa que fiz foi usar a função fopen() do php com permissão a acessar arquivos remotos, e depois setar o header do php para disponibilizar o arquivo como attachment. Logo vi em conjunto com a equipe de tecnologia que isso não seria uma solução, mas sim um problema, pois a função fopen() baixava os arquivos da Amazon S3 para o servidor, e depois disponibilizava o arquivo para o usuário, logo, iríamos pagar os custos de tranferência de dados duas vezes: uma pela transferência dos arquivos da Amazon S3 para o servidor, e depois do servidor para o usuário, além do tempo de download ser a soma desses dois downloads.

Perdi três preciosos dias buscando uma solução, pesquisando, pensando, tentando várias coisas que encontrei, tais como setar cabeçalhos (HTTP Header) diretamente nos arquivos, ou ao subir os arquivos para a Amazon S3… Estava quase desistindo, quando encontrei um site maravilhoso com ótimas dicas de configurações do Apache e do .htdocs (salve nos seus favoritos! Você vai precisar!).

Então saí da câmara escura e comecei a enxergar novos horizontes.

Criei uma pasta downloads na raíz do site e dentro dela coloquei um arquivo .htacces com a seguinte configuração:


IndexIgnore *
RewriteEngine On

RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^mp3/(.*)$ http://seubucket.s3.amazonaws.com/pasta/$1?%1 [P,E=PERMITE:1]

RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^pdf/(.*)$ http://seubucket.s3.amazonaws.com/pasta/$1?%1 [P,E=PERMITE:1]

RewriteCond %{ENV:PERMITE} !1$ [NC]
RewriteRule .* - [R=404,NS,L]

Header set Content-Disposition "attachment;" env=PERMITE

Explicando:

  1. A primeira linha simplesmente não permite listar os arquivos do diretório.
  2. A segunda linha habilita o módulo rewrite do apache.
  3. A quarta linha (assim como a sexta) pega os parâmetros passados pela url (como a autenticação para arquivos protegidos na Amazon S3) através de uma condição Rewrite e coloca no lugar de %1 na linha seguinte.
  4. A quinta linha (assim como a sétima) faz o rewrite, ou seja, reescreve a url recebida para a url original. A mágica acontece ao setar a flag P, que diz que a url será acessada via mod_proxy do Apache. Nesta linha também é setada uma variável PERMITE, que terá o valor 1 se a condição RewriteRule for satisfeita.
  5. Na décima linha, verifico se a varíavel PERMITE possui valor diferente de 1, através de uma condição Rewrite, e, se for o caso, apresento uma página de erro 404, e ecerro a execução do código (flag L).
  6. Finalmente, na linha 13, se o código chegar até lá (ou seja, pelo menos uma das duas condições foi satisfeita => PERMITE = 1), defino o cabeçalho do conteúdo como attachment, ou seja, para download, e então aparece aquela janelinha linda de “Salvar arquivo como…”

Desta forma, para fazer download do arquivo com a opção “Salvar como”, basta que a url do botão/link de download seja no formato


http://www.exemplo.com.br/downloads/mp3/nomedoarquivo.mp3?par=XXX&par=YYY ou

http://www.exemplo.com.br/downloads/pdf/nomedoarquivo.pdf?par=XXX&par=YYY

(os parâmetros são opcionais dependendo do que você estiver fazendo)

Se o arquivo


http://seubucket.s3.amazonaws.com/pasta/nomedoarquivo.pdf?par=XXX&par=YYY

existir aparecerá a janela de download, caso contrário, será exibido um erro 404.

Enfim, como disse no começo, para isso funcionar, o servidor Apache deve estar com os módulos mod_rewrite e mod_poxy, e mod_proxy_http habilitados. Para isso, certifique-se de que as seguintes linhas do httpd.conf estejam descomentadas:


LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so

Eu usei Apache 2.2.X e não testei em outras versões.

Espero que este artigo tenha sido útil para você, e, se era isso o que você estava procurando, fico feliz se você encontrou a solução em menos de 3 dias! ;)

Até a proxima!

Related Posts Plugin for WordPress, Blogger...

Posts Relacionados:

SEO Powered by Platinum SEO from Techblissonline