Tema: FAQ's de PHP
Ver Mensaje Individual
  #45 (permalink)  
Antiguo 28/01/2003, 13:05
Cluster
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
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();
?>

Última edición por Cluster; 10/02/2003 a las 22:15