Foros del Web » Programando para Internet » PHP »

Download con php

Estas en el tema de Download con php en el foro de PHP en Foros del Web. Hola, queria saber si alguien conoce como hacer un download con php y que tenga " resume" para el getright y el download acelerator pro. ...
  #1 (permalink)  
Antiguo 15/01/2003, 15:28
 
Fecha de Ingreso: junio-2001
Ubicación: Cordoba, Argentina
Mensajes: 190
Antigüedad: 22 años, 10 meses
Puntos: 0
Download con php

Hola, queria saber si alguien conoce como hacer un download con php y que tenga "resume" para el getright y el download acelerator pro.
Yo hago el clasico. Con la cabecera header como el siguiente ejemplo.

error_reporting(0);
header("Last-Modified: " . gmdate("D, d M Y H:i:s T", filemtime($filename)));
header("Accept-Ranges: bytes");
header("Content-Length: " . filesize($filename));
header("Content-Disposition: attachment; filename=" . $download);
readfile($filename);
header("Connection: close");
exit();

pero cuando lo bajo con el geright me dice que el server no soporta resume.

Si alguien conoce una solucion posteela porfavor.
Gracias y Saludos.
__________________
Martin
  #2 (permalink)  
Antiguo 15/01/2003, 16:53
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Segun dice el protocoolo HTTP/1.1:

Content-Range: bytes 0-total_bytes_archivo/total_bytes_archivo

Ese 'total_bytes_archivo' ya lo obtienes con tu filesize() ...

Ese sería lo mas básico .. pruebalo y nos comentas q tal te fué (Lo encontré justo porque estaba revisando por ahí otros temas .. ).

mas info y detalles:
http://www.w3.org/Protocols/rfc2616/....html#sec14.16

Protocoolo HTTP/1.1 completo (con todas y muchasss mas cabeceras q usas):
http://www.w3.org/Protocols/rfc2616/rfc2616.html

Un saludo,
  #3 (permalink)  
Antiguo 24/01/2003, 09:02
 
Fecha de Ingreso: junio-2001
Ubicación: Cordoba, Argentina
Mensajes: 190
Antigüedad: 22 años, 10 meses
Puntos: 0
Script que soporta resume

Aca termine el script de download que soporta resume para getright y download acelerator (y otros) es un poco basico y se puede mejorar.
Aclaracion: php debe funcionar como modulo ded apache, ya que usa la funcion getallheaders que es del apache.
Espero les sirva

<?
$headers = getallheaders();


$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();
?>
__________________
Martin
  #4 (permalink)  
Antiguo 24/01/2003, 15:22
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Te sugiero que lo pongas en las FAQ's de PHP .. es interesante el tema y mas con tus comentarios q explicas un pco como funciona la cosa ...

Acuerdate de seguir el formato de las FAQ's (tema .. pregunta .. respuesta) y pon el código usando el boton "PHP" el cual mostrará el código PHP coloreado para una mejor lectura del mismo.

Un saludo,
  #5 (permalink)  
Antiguo 24/01/2003, 16:10
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

Muy bueno el codigo. Sobre todo porque combina la sencillez con la potencia. Puede que no sea una necesidad muy comun, pero es una demostracion de lo que se puede llegar a hacer con PHP. Un 10. Cuando lo pongas en el FAQ, si no es mucho pedir, ¿podrias poner un par de links donde se pueda investigar sobre las cabeceras HTTP (incluido el enlace a la descripcion oficial en www.w3.org)?

Mis felicitaciones. Sigue asi.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #6 (permalink)  
Antiguo 24/01/2003, 16:42
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Josemi .. yo puse el link hacia la RFC en cuestión ..

Es la RFC 2616 .. sección 14.16 .. Por lo menos ahí hace mención al Content-Range: ..

Un saludo,
  #7 (permalink)  
Antiguo 28/01/2003, 10:22
 
Fecha de Ingreso: junio-2001
Ubicación: Cordoba, Argentina
Mensajes: 190
Antigüedad: 22 años, 10 meses
Puntos: 0
variable de rango

aclaracion, para que el scritp funcione en cualquier servidor web, se puede utilizar la variable $HTTP_RANGE la cual nos indica que bytes vamos a transferir y no la funcion getallheaders() ( Ademas ahorra memoria)

bueno, Saludos, Martin.

PD: Agreguen el script a las FAQ, no se como se hace...
__________________
Martin
  #8 (permalink)  
Antiguo 28/01/2003, 12:54
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Martin .. agregarlo a las FAQ's es tan solo ponerlo en las FAQ's como una respuesta .. (es un mensaje como otro cualquiera ..)

De todas formas .. ya lo pongo yo en las FAQ's con tus correspondientes créditos y con está última revisión del código q has comentado ..

Por cierto .. supongo q podremos usar $_SERVER['HTTP_RANGE'] .. o $HTTP_SERVER_VARS['HTTP_RANGE'] .. para que el script ya puestos sea mas seguro y compatible con register_globals a OFF en configuraciones de servidores ..

Un saludo,

Última edición por Cluster; 28/01/2003 a las 13:06
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:16.