Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

allex_carvalho

[Resolvido] Forçar download

Recommended Posts

Boa noite pessoal.

 

Estou tentando força um download. Até então está beleza, quando clica no link está aparecendo a caixa para download. Porém, quando baixa, vem em média 2kb (e os arquivos tem mais ou menos 60 mega). E não abre o arquivo.

 

Vejam o código:

 

link:

<li><strong>" . $cont . " - </strong><a href=\"baixar_logado.php?id=".$id_codificado."&id_arquivo=".$rs->id."\" title=\"" . $rs->titulo . "\">" . $rs->titulo . "</a></li>

 

baixar_logado.php

<?php
require_once 'cabecalho.php';
require_once 'topo.php';
$id = base64_decode($_GET['id']);
if (!isset($_SESSION['usuario'])) {
   header("Location:./");
} else {

// Define o tempo máximo de execução em 0 para as conexões lentas
set_time_limit(0);

$id = $_GET['id'];
$id_decodificado = base64_decode($id);
$id_arquivo = $_GET['id_arquivo'];

$sql = "SELECT * FROM arquivos WHERE id=".$id_arquivo;
$qr = mysql_query($sql) or die(mysql_error());
$rs = mysql_fetch_object($qr);

$aquivoNome = $rs->arquivo;
$arquivoLocal = "uploads/" . $id_decodificado . "/".$aquivoNome;

// Verifica se o arquivo não existe
if (!file_exists($arquivoLocal)) {
echo "<script type=\"text/javascript\">alert('Arquivo não encontrado');</script>";
exit;
}

// Definimos o novo nome do arquivo
$novoNome = $rs->arquivo;

// Configuramos os headers que serão enviados para o browser
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename="'.$novoNome.'"');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($aquivoNome));
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Expires: 0');

// Envia o arquivo para o cliente
readfile($aquivoNome);

}
?>

 

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente acrescentar esse esse:

header('Connection: Keep-Alive');

 

 

Se não der certo, verifique se o PHP está passando os valores estão realmente corretos para o header:

echo "<pre>
Content-Disposition: attachment; filename=\"{$novoNome}\"
Content-Length: " . filesize($aquivoNome) . "
</pre>";

 

Ou então verifique no painel do Firebug.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Será que ele não está retornando uma mensagem de erro nesse arquivo? Você disse que vem apenas 2kb, você tentou abrir para ver?

 

Acho que você tem que retirar esses:

require_once 'cabecalho.php';

require_once 'topo.php';

 

Testei aqui o código abaixo e funcionou.

 

switch(strtolower(substr(strrchr($aquivoNome,'.'),1)))
{
case 'pdf': $mime = 'application/pdf'; break;
case 'zip': $mime = 'application/zip'; break;
case 'jpeg':
case 'jpg': $mime = 'image/jpg'; break;
default: $mime = 'application/force-download';
}


header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Last-Modified: '.gmdate ('D, d M Y H:i:s', filemtime ($aquivoNome)).' GMT');
header('Cache-Control: private',false);
header('Content-Type: '.$mime);
header('Content-Disposition: attachment; filename="'.basename($aquivoNome).'"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.filesize($aquivoNome));
header('Connection: close');
readfile($aquivoNome);
exit;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum... Agora funcionou :D

 

Realmente os requires cabecalho e topo não precisavam (já que eu não vou carregar isso). Ai fiz um só com a conexão.

Tudo fico assim:

 

<?php

require_once 'php/mysql_connect.php';
$id = base64_decode($_GET['id']);

// Define o tempo máximo de execução em 0 para as conexões lentas
set_time_limit(0);

$id = $_GET['id'];
$id_decodificado = base64_decode($id);
$id_arquivo = $_GET['id_arquivo'];

$sql = "SELECT * FROM arquivos WHERE id=" . $id_arquivo;
$qr = mysql_query($sql) or die(mysql_error());
$rs = mysql_fetch_object($qr);

$aquivoNome = "uploads/" . $id_decodificado . "/" . $rs->arquivo;

switch(strtolower(substr(strrchr($aquivoNome,'.'),1)))
{
case 'pdf': $mime = 'application/pdf'; break;
case 'zip': $mime = 'application/zip'; break;
case 'jpeg':
case 'jpg': $mime = 'image/jpg'; break;
default: $mime = 'application/force-download';
}

// Configuramos os headers que serão enviados para o browser
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($aquivoNome)) . ' GMT');
header('Cache-Control: private', false);
header('Content-Type: ' . $mime);
header('Content-Disposition: attachment; filename="' . basename($aquivoNome) . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($aquivoNome));
header('Connection: close');
readfile($aquivoNome);
?>

 

Uma dúvida, o sistema de upload não tem restrição quanto a extensão de arquivo. Se subir um mkv, ou .rar ou algum outro formato que não tem na lista acima, vai funcionar? Se não, como fazer para liberar todas as extensões?

 

Mais uma vez, obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aquilo ali é só pra identificar o tipo MIME. O padrão é 'application/force-download'. Mas já li em algum lugar, não me lembro onde, que o IE não identifica isso e teria de ser 'application/octet-stream' para ele. Bom... você teste aí pra ver..

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.