2012-10-15 18 views
7

Ho uno script php che consente all'utente di scaricare file di grandi dimensioni con il curriculum del download.Download - connessioni max per utente?

Questo funziona bene ma ho limitato la velocità di download con php-code a 200kb/s per connessione.

Quindi, Mozilla Firefox Download Manager effettua una sola connessione e la velocità è di circa 200kb/s ma Free-Download-Manager o JDownloader effettua da 2 a 4 connessioni e quindi, la velocità di download è (200Kb/s * 2 o 4) = Da 400 a 800kb/s.

Come posso interrompere questo e consentire solo una connessione per ogni utente per scaricare questo file?

+0

Un modo sarebbe quello di generare un id di sessione che verrà invalidato alla prima connessione. – nkr

+0

È necessario identificare gli utenti in qualche modo e quindi limitare * per * utente, non * per * download. – nalply

+0

ok anche in php è possibile farlo solo con ID di sessione, indirizzi IP, database mysql ecc. Va bene, ma ho pensato che sia possibile su .htacess o qualcos'altro ... –

risposta

7

A. Penso che la prima cosa per voi è quella di disabilitare Content-Range ..

14.16 Content-Range

L'entità-header Content-Range viene inviato con un'entità-parziale del corpo per specificare in quale parte del soggetto-corpo pieno parziale corpo dovrebbe essere applicato. Le unità di portata sono definite nella sezione 3.12.

Download Manager è possibile scaricare un singolo bene in 2 o più connessioni a causa della gamma .. se si disattiva questa sia download resume o multiple connections non possono essere effettuate su un singolo file. avrebbero fatto ogni richiesta per l'inizio del file dall'inizio

Esempio

LoadModule headers_module modules/mod_headers.so 
Header set Accept-Ranges none 
RequestHeader unset Range 

Si dovrebbe anche guardare 14.35.1 Byte Ranges

B. Presenta le sessioni di download.

È possibile generare un uniqid id per ogni download e servirlo tramite la pagina PHP. Se il download è ancora attivo o è stato richiesto prima di esistere solo nella pagina

Esempio

$realFile = "test.pdf"; 
$fakeFile = uniqid("file"); 

$uniqid = isset($_REQUEST['id']) ? $_REQUEST['id'] : null; 
if (empty($uniqid) || strlen($uniqid) < 20 || !ctype_xdigit($uniqid)) { 
    die("Die! Die! Die! Stolen URL"); 
} 
$memcache = new \Memcache(); 
$memcache->connect('localhost', 11211); 

$runtime = (int) $memcache->get($uniqid); 

if ($runtime) { 
    die("Die! Die! Die! You Multiple Down loader"); 
} else { 
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT\n"); 
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-disposition: attachment; filename=$fakeFile.pdf"); // 
    header('Content-type: application/pdf'); 
    header("Content-length: " . filesize($realFile)); 
    readfile($realFile); 
    $memcache->set($uniqid, 1); 
} 

semplice client

$url = "a.php?id=" . bin2hex(mcrypt_create_iv(30, MCRYPT_DEV_URANDOM)); 
printf("<a href='%s'>Download Here</a>",$url); 

Sarebbe uscita una cosa del genere

<a href='a.php?id=aed621be9d43b0349fcc0b942e84216bf5cd34bcae9b0e33b9d913cccd6e'>Download Here</a> 

È anche bisogno di mappare ogni id per un particolare file ...