Tema: Descargas - Downloads de archivos.
Pregunta: ¿Como puedo hacer descargas con opción 'Resume'?
Créditos: MartinAcevedo Respuesta:
Nota: Solo 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";
//aca se obtiene la cabecera que nos dice desde que 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 modifcar 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 informacion
rewind ($fp);
fseek ($fp, $bytes);
//mandamos el pedazo de archivo correspondiente
// la funcion fpassthru() es similar a readfile() en que manda el archivo por la salida estandar (mejor que usar un ciclo con fread adentro),
// la diferencia con readfile es que debe ser abierto con fopen, esta funcion devuelve todos los bytes por la salida estandar
// desde la posicion actual del puntero hasta el final del archivo
if(!fpassthru($fp)) {
echo "error de salida";
exit();
}
header("Connection: close");
exit();
?>