Ir para conteúdo

POWERED BY:

Arquivado

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

allex_carvalho

[Resolvido] Fazer um download por vez

Recommended Posts

Boa tarde pessoal.

 

Estou com um sistema de download de arquivos. Ele gerencia para que seja efetuado um download por vez. Só que estou com dois problemas:

 

1- Arquivos grandes não faz download (um video em wmv de quase 3 mega baixa, outro de quase 40 mega não);

2- Não está bloquando o download.

 

Veja o código para verem o que pode ser:

 

<?php

require_once 'php/mysql_connect.php';

set_time_limit(0);

// Caminho do arquivo que está sendo requisitado
$caminho = mysql_real_escape_string($_SERVER['REQUEST_URI']);

// IP do indivíduo que está requisitando o arquivo
$ip = mysql_real_escape_string($_SERVER['REMOTE_ADDR']);

// Está baixando?
$baixando = false;

// Seleciona o último acesso em formato UNIX, equivalente ao mktime()
$sql = "SELECT UNIX_TIMESTAMP(ultimoacesso) AS ultimavez FROM baixando WHERE arquivo = '$caminho' AND ip = '$ip' ORDER BY ultimoacesso DESC LIMIT 1";

$rs = mysql_query($sql);

if (mysql_num_rows($rs)) {
   $ultimaVez = mysql_result($rs, 0, 'ultimoacesso') + 300;
   if ($ultimaVez < time()) {
       mysql_query("REPLACE baixando SET caminho = '$caminho', ip = '$ip', ultimoacesso = NOW()");
       $baixando = true;
   }
} else {
   $sql = "REPLACE baixando SET caminho = '$caminho', ip = '$ip', ultimoacesso = NOW()";
   mysql_query($sql);
   $baixando = true;
}

if ($baixando) {
   $id_arquivo = base64_decode($_GET['id_arquivo']);
   $sql = "SELECT * FROM arquivos WHERE id=" . $id_arquivo;
   $qr = mysql_query($sql);
   $rs = mysql_fetch_object($qr);
   $diretorio = "deposit/uploads/" . $rs->id_usuario . "/";
   $path = $rs->arquivo;
   $caminhoCompleto = $_SERVER['DOCUMENT_ROOT'] . $diretorio . $path;
   if ($fp = fopen($caminhoCompleto, 'r')) {
       $data = date("Y-m-d H:i:s");
       $inserir = "INSERT INTO baixando VALUES (NULL, '$path', '$ip', '$data')";
       mysql_query($inserir);
       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($caminhoCompleto)) . ' GMT');
       header('Cache-Control: private', false);
       header('Content-Type: application/force-download');
       header('Content-Disposition: attachment; filename="' . basename($caminhoCompleto) . '"');
       header('Content-Transfer-Encoding: binary');
       header('Content-Length: ' . filesize($caminhoCompleto));
       header('Connection: close');
       readfile($caminhoCompleto);
       exit;
   }
} else {
   header('HTTP/1.0 503 Service Unavailable');
   print '<h1>503 Service Unavailable</h1><p>Você só pode fazer outro download em 5 minutos</p>';
   exit;
}
?>

 

Conferi no banco de dados, os dados estão gravados corretamente na tabela baixando.

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

if ($fp = fopen($caminhoCompleto, 'r')) {

Aqui, você abre o arquivo para verificar se ele existe?

 

fopen pode, não posso dizer com certeza, ocupar recursos de memória (diferente da função readfile). Se você só está verificando o arquivo, é muito mais útil utilizar a função is_file.

 

is_file vai retornar apenas um boolean, enquanto fopen retorna um resource.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Gabriel, fiz a alteração na linha. Agora ficou assim:

 

if (is_file($caminhoCompleto)) {

 

Porém, continuo com os mesmos 2 erros.

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso é online?

coloque essas linhas no início do seu código para verificar a existência de algum possível erro.

ini_set( 'display_errors', true );
error_reporting( E_ALL );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Remova os headers para verificar a existência de algum erro.

$data = date("Y-m-d H:i:s");
$inserir = "INSERT INTO baixando VALUES (NULL, '$path', '$ip', '$data')";
mysql_query($inserir);
readfile($caminhoCompleto);
exit;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum... Agora deu erro.

 

( ! ) Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 40804352 bytes) in C:\wamp\www\deposit\completa_download.php on line 49

 

O que é mais estranho é que tenho outro sistema de download em outra página e baixo o mesmo arquivo.

 

Mais enfim, resolvi aqui, coloquei 1GB de limite, é local mesmo, rss

 

Agora é ver o porque ele não está bloqueando o download. Verifiquei na tabela baixando, está gravando os dados certinho.

 

 

Obrigado pela atenção.

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.