PHP:¿Cómo puedo hacer descargas con opción 'Resume'?

De Foros del Web

Nota: Sólo funciona bajo PHP como Módulo de Apache ...


Código PHP:

<? 
$headers = $_SERVER['HTTP_RANGE']; 
// Si usas PHP inferior a 4.1.x usar $headers=$HTTP_RANGE; (y register_globlas a ON) 
 
$filename="archivo.exe";  
 
//acá se obtiene la cabecera que nos dice desde qué byte tenemos que enviar 
//lo guardamos en $bytes. 
 
if ($headers[Range]){ 
$pos=strpos ($headers[Range], "bytes="); 
$pos2=strpos($headers[Range],"-"); 
$bytes=substr ($headers[Range], $pos+strlen("bytes="),$pos2-($pos+strlen("bytes=")));  
}else{ 
$bytes=0; 
} 
settype ($bytes, "integer"); 
 
$tarchivo=filesize($filename)-$bytes; 
$ttotal=filesize($filename); 
 
error_reporting(0); 
 
header("Last-Modified: " . gmdate("D, d M Y H:i:s T", filemtime($filename))); 
header("Accept-Ranges: bytes"); 
header("Content-Length: " . $tarchivo); 
header("Content-Disposition: attachment; filename="."archivo.exe"); 
//indicamos al cliente que bytes del archivo vamos a transferir 
//en este caso es desde $bytes hasta el final del archivo 
//que es lo que nos pide el get right normalmente 
//se puede modificar tomando el ultimo byte del rango 
//para hacer mirroring tipo kazaa (seria una version mas avanzada) 
header("Content-Range: bytes ".$bytes."-".($ttotal-1)."/".$ttotal); 
 
header("Content-Type: application/octet-stream"); 
 
//abrimos el archvo 
$fp = fopen($filename,'rb'); 
 
if (!$fp) { 
echo "error de apertura"; 
exit(); 
} 
//nos movemos hasta el byte donde debemos empezar a mandar información 
rewind ($fp); 
fseek ($fp, $bytes); 
 
//mandamos el pedazo de archivo correspondiente 
// la función fpassthru() es similar a readfile() en que manda el archivo por la salida estándar (mejor que usar un ciclo con fread adentro),  
// la diferencia con readfile es que debe ser abierto con fopen, esta función devuelve todos los bytes por la salida estandar 
//  desde la posición actual del puntero hasta el final del archivo 
if(!fpassthru($fp)) { 
echo "error de salida"; 
exit(); 
} 
 
header("Connection: close"); 
 
exit(); 
?> 

--Cluster 28 Ene 2003

Este artículo es parte de las FAQs de PHP y el Manual de PHP.

Herramientas personales