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.
- Indice de las FAQs: Conceptos, Configuración, Formularios, Manejo de Archivos, Integración con Bases de Datos, Sesiones, Extensiones y Librerías, Seguridad, Funciones, Clases y Objetos, Frameworks
- Recomendamos también: Guía Zend, Frameworks PHP, Aceleradores PHP
- Agregar al FAQ: PHP: Instrucciones para agregar una pregunta al FAQ de PHP
- Para preguntas sobre PHP: Foro de Php
