Los comentarios son del autor de la funcion :
Código PHP:
<?php
function enviar_archivo($archivo, $speed)
{
$ctype="application/zip";
// Recolectamos información sobre el archivo
$archivo_nombre = basename($archivo);
// Empezamos con los headers
header("Cache-Control:");
header("Cache-Control: public");
header("Content-Type: $ctype");
// Forzamos la descarga en lugar de la apertura
$header='Content-Disposition: attachment; filename='.$archivo_nombre;
header($header);
header("Accept-Ranges: bytes");
$tamano = filesize($archivo);
// Si el navegador nos solicita el http_range...
if(isset($_SERVER['HTTP_RANGE'])) {
// entonces le enviamos sólo el trozo que falta.
list($a, $rango)=explode("=",$_SERVER['HTTP_RANGE']);
str_replace($rango, "-", $rango);
$tamano2=$tamano-1;
$nueva_longitud=$tamano2-$rango;
header("HTTP/1.1 206 Partial Content");
header("Content-Length: $nueva_longitud");
header("Content-Range: bytes $rango$tamano2/$tamano");
} else {
// Si no le enviamos todo el pack
$tamano2=$tamano-1;
header("Content-Range: bytes 0-$tamano2/$tamano");
header("Content-Length: ".$tamano2);
}
// Sólo queda abrir el archivo...
$puntero_al_fichero = fopen("$archivo","rb");
// localizar el inicio de la parte que queremos enviar...
fseek($puntero_al_fichero,0);
// y empezar a enviar.
while(!feof($puntero_al_fichero)) {
set_time_limit(0);
// Ponemos los datos en el buffer...
print(fread($puntero_al_fichero,1024*$speed));
// Lanzamos el contenido del buffer...
flush();
// Y a dormir...
sleep(1);
}
// archivo descargado
fclose($puntero_al_fichero);
exit;
}
enviar_archivo("zips/ejemplo.zip",50);
?>