Ir para conteúdo

POWERED BY:

Arquivado

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

Landerson Almeida

Forçador de Download não Enviar o arquivo corretamente

Recommended Posts

<?php
if(empty($_GET['id'])){
echo "<meta charset='UTF-8'/><b style='font-family:arial;'>Erro na requisiçao</b>";
}else{
	$id = $_GET['id'];
    $link = arquivos."/".$id;
	header('Content-Description: File Transfer');
	header('Content-Disposition: attachment; filename="'.$id.'"');
	header('Content-Type: application/octet-stream');
	header('Content-Transfer-Encoding: binary');
	header('Content-Length: ' . filesize($link));
	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	header('Pragma: public');
	header('Expires: 0');
    readfile($link);
}
 ?>

O poblema é que ele não esta passando o tamanho correto no navegador le passa valores em Kb

- Eu ja tinha lido este tópico http://forum.imasters.com.br/topic/414195-resolvido-problema-com-download-em-php/ Mais não adiantou se alguem poder me ajudar eu agradeço muito!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi exatamente o que está acontecendo, está baixando um arquivo em branco? Parece que você não especifica a extensão do arquivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, não sei como você está montando o path do arquivo, porque pelo visto você tem o diretório de onde estão armazenados e o id que me parece ser o nome do arquivo, mas onde está extensão? Está no id? Mas de qualquer forma tente debugar pra ter certeza de que o caminho está correto e conferir o tamanho do arquivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se assim for então não há problemas, até testei o código aqui e funcionou normalmente, imagino eu que "arquivos" seja uma constante com o diretório certo?

 

Já que "download.php" está na raiz e vc tem um diretório chamado arquivos, você também poderia fazer assim:

__DIR__ . "/arquivos/" . $id;
A constante __DIR__ possui o diretório do arquivo em execução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então brigado por explicar mais esta dando no mesmo vejamos com um arquivo de 156MB:

91ra.png



Resolvi fazendo estas alteraçoes:

<?php
if(empty($_GET['id'])){
echo "<meta charset='UTF-8'/><b style='font-family:arial;'>Erro na requisiçao</b>";
}else{
	$id = $_GET['id'];
    $link = arquivos."/".$id;
    if( !file_exists($link) ) return;
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($id));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($link));
    ob_clean();
    flush();
    readfile($link);
}
 ?>

Mais se o arquivo tiver mais de 2 pontos ele nao forneçe o tipo do arquivo por exemplo arquivo.oi.rar ele faz o download mais não forneçe o nome com a extensão

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hmm limpar o buffer, se assim resolveu deve ser porque antes você esteja fazendo algum tipo de saída talvez, mas enfim o motivo de não estar com extensão é porque você está usando o basename(), ele é desnecessário aí, deixe só $id como estava antes para ficar com o nome completo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Todas as alteraçoes feitas:

<?php
if(empty($_GET['id'])){
echo "<meta charset='UTF-8'/><b style='font-family:arial;'>Erro na requisiçao</b>";
}else{
	$id = $_GET['id'];
    $link = arquivos."/".$id;
    if( !file_exists($link) ) return;
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
	header('Content-Disposition: attachment; filename="'.$id.'"');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($link));
    ob_clean();
    flush();
    readfile($link);
}
 ?>

Bom com arquivos em video ele baixa e tals tamanho e nome correto mais quando eu executo em algum player ele não reproduz corretamente! :s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aí já pode ser problema do vídeo, pois não há ligação alguma em relação ao download.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porem acessando direto exemplo arquivos/arquivo.mkv ele fica normal

 

 

Agora ele nao esta me Fornecendo o tamanho do arquivo:

 

<?phpif(empty($_GET['id'])){echo "<meta charset='UTF-8'/><b style='font-family:arial;'>Erro na requisiçao</b>";}else{	$id = $_GET['id'];    $link = arquivos/$id;	header('Content-Description: File Transfer');	header('Content-Disposition: attachment; filename="'.$id.'"');	header('Content-Type: application/octet-stream');	header('Content-Transfer-Encoding: binary');	header('Content-Length: ' . filesize($link));	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');	header('Pragma: public');	header('Expires: 0');    readfile($link);} ?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que está fazendo esta barra aí?

$link = arquivos/$id;

 

Se tratando de uma string o certo seria:

$link = arquivos . "/" . $id;

Como estava em seu código anterior, talvez seja devido à isso o arquivo estar sem tamanho, path incorreto. E na questão dos vídeos se for falha de imagem eu desconheço isso :wacko: muito estranho mesmo.

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.