Foros del Web » Programando para Internet » PHP »

Script para bajar archivos.

Estas en el tema de Script para bajar archivos. en el foro de PHP en Foros del Web. Hola a todos. Por favor necesito ayuda con un script que me viene dando pelea desde hace literalmente una semana. Me base en un script ...
  #1 (permalink)  
Antiguo 28/05/2006, 18:02
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 4 meses
Puntos: 2
Script para bajar archivos.

Hola a todos.

Por favor necesito ayuda con un script que me viene dando pelea desde hace literalmente una semana.

Me base en un script de PHP.NET para crear un script que despacha downloads. Es decir, cuando los usuarios de mi sitio quieren bajarse un archivo yo llamo a:

download.php?archivo=".$archivo."&ftipo=".$tipo;

Dentro del script relaciono FTIPO con un directorio, luego con $archivo completo el path y envio un redirect hacia el archivo con un force-download.

El tema es que mi script permite bajar archivos tranquilamente, pero cuando estoy bajando 2 archivos al mismo tiempo no me permite ir a otra página ni actualizar la página actual hasta que alguno de los 2 archivos haya sido totalmente descargado.

Al principio me pasaba con solo bajar 1 archivo. Hasta que ese archivo no se descargara no me permitia hacer otra cosa... luego encontre en google que habia que utilizar "session_write_close();" para que esto no suceda.

Conclusion, si bajo 1 solo archivo por vez puedo moverme libremente por el sitio, pero si estoy bajandome 2 archivos al mismo tiempo el browser queda estancado hasta que uno termine... esto sucede tanto con IE como con Opera y Mozilla...

Si alguno tiene experiencia en el tema le pediria por favor que me de su consejo ya que no se a donde más ir a buscar información y a su vez este tipo de scripts parese ser de uso comun.

ADJUNTO EL SCRIPT por si es necesario, MUCHAS GRACIAS A TODOS.


Código PHP:
session_start();
session_write_close();
...
// Aqui controlo errores y hago armo variables
// esta parte del código ya ha sido testeada y no contiene errores
// pero la omito para no sobrecargar el post
...

$fsize filesize($fpath);
$bufsize 20000;

if(isset(
$_SERVER['HTTP_RANGE']))  //Partial download
{
   if(
preg_match("/^bytes=(\\d+)-(\\d*)$/"$_SERVER['HTTP_RANGE'], $matches)) { //parsing Range header
       
$from $matches[1];
       
$to $matches[2];
       if(empty(
$to))
       {
           
$to $fsize 1;  // -1  because end byte is included
                               //(From HTTP protocol:
// 'The last-byte-pos value gives the byte-offset of the last byte in the range; that is, the byte positions specified are inclusive')
       
}
       
$content_size $to $from 1;

       
header("HTTP/1.1 206 Partial Content");
       
header("Content-Range: $from-$to/$fsize");
       
header("Content-Length: $content_size");
       
header("Content-Type: application/force-download");
       
header("Content-Disposition: attachment; filename=$fname");
       
header("Content-Transfer-Encoding: binary");
       
header("Cache-Control: private");

       if(
file_exists($fpath) && $fh fopen($fpath"rb"))
       {
           
fseek($fh$from);
           
$cur_pos ftell($fh);
           while(
$cur_pos !== FALSE && ftell($fh) + $bufsize $to+1)
           {
               
$buffer fread($fh$bufsize);
               print 
$buffer;
               
$cur_pos ftell($fh);
           }

           
$buffer fread($fh$to+$cur_pos);
           print 
$buffer;

           
fclose($fh);
       }
       else
       {
           
header("HTTP/1.1 404 Not Found");
           exit;
       }
   }
   else
   {
       
header("HTTP/1.1 500 Internal Server Error");
       exit;
   }
}
else 
// Usual download
{
   
header("HTTP/1.1 200 OK");
   
header("Content-Length: $fsize");
   
header("Content-Type: application/force-download");
   
header("Content-Disposition: attachment; filename=$fname");
   
header("Content-Transfer-Encoding: binary");
   
header("Cache-Control: private");

   if(
file_exists($fpath) && $fh fopen($fpath"rb")){
       while(
$buf fread($fh$bufsize))
           print 
$buf;
       
fclose($fh);
   }
   else
   {
       
header("HTTP/1.1 404 Not Found");
   }
}
?> 
  #2 (permalink)  
Antiguo 29/05/2006, 02:34
 
Fecha de Ingreso: abril-2006
Mensajes: 62
Antigüedad: 18 años
Puntos: 0
header()

No puedo ayudarte mucho con esto, pero te podrías deshabilitar todas las llamadas a header() y dejar sólo
header("Content-Disposition: attachment; filename=$fname");
que parece ser la imprescindible para lo que estás haciendo, y después ir agregandolas para encontrar el problema.
__________________
Guish
  #3 (permalink)  
Antiguo 29/05/2006, 11:52
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 4 meses
Puntos: 2
Guish, gracias por tu respuesta.

Directamente use lo único y básico para que se genere el download, y me sigue haciendo lo mismo.. mira, utilice solo esto:

Código PHP:
$fname $_GET['file'];
$fpath $_SERVER['DOCUMENT_ROOT']."/media_all/mp3/".$_GET['file'];
$fsize filesize($fpath);
$bufsize 20000;

   
header("Content-Disposition: attachment; filename=$fname");

   if(
file_exists($fpath) && $fh fopen($fpath"rb")){
       while(
$buf fread($fh$bufsize))
           print 
$buf;
       
fclose($fh);

   } else {

       
header("HTTP/1.1 404 Not Found");
   } 
Es extrañisimo... tendrá algo que ver el servidor ? Por las dudas ya mismo les envio a ellos un email a ver que dicen.. no se me habia ocurrido pero bueno quiero ir tapando agujeros.

Nuevamente, gracias... espero poder solucionarlo.
  #4 (permalink)  
Antiguo 29/05/2006, 12:08
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 4 meses
Puntos: 2
Bueno encontre algo que quizá sirva...

probe hacer el download directo (pegando en la URL el link al archivo)

en IE y en FIREFOX tengo el mismo problema, si hay más de 2 archivos descargandose el browser queda MUERTO, colgado, hasta que uno no termina nno puedo hacer nada...

NO ES ASI con OPERA.... con este SI pude actualizar la página, navegar, etc.


¿Será algo en lod headers entonces? :O


¿Alguien habrá experimentado con esto y podrá darme alguna orientación?

GRACIAS
  #5 (permalink)  
Antiguo 29/05/2006, 12:08
 
Fecha de Ingreso: abril-2006
Mensajes: 62
Antigüedad: 18 años
Puntos: 0
Exclamación hasta ahí llegué

lamento no poder ayudarte más, si encontrás la causa por favor contame
__________________
Guish
  #6 (permalink)  
Antiguo 29/05/2006, 12:31
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 4 meses
Puntos: 2
Por supuesto, si consigo solucionarlo creao un FAQ... no le deseo a nadie este dolor de cabeza... gracias por la onda Guish, saludos.


¿alguno se suma a la quest? :P

saludos.
  #7 (permalink)  
Antiguo 29/05/2006, 12:55
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
No se si te sirva, pero a mi me pasa lo mismo cuando bajo 2 files de una misma web (aunque no sean via PHP) asi que yo creo es una limitante del browser y no de tu script.

Por cierto esta padre tu script para bajar filez (y)
  #8 (permalink)  
Antiguo 29/05/2006, 13:41
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 4 meses
Puntos: 2
Hola que tal?

Bueno la verdad lo que me decis me sirve mucho. Yo estuve practicando eso mismo que vos decis, pero recorde que habia muchos sitios que SI me permitian navegar apesar de estar descargando dos archivos a la vez... igualmente, si el 80% de los sitios responden de esta forma no me molestaría que el mio lo haga tambien... pero bueno uno siempre intenta buscar lo mejor para su sitio.

Si te gusta el script, cuando termine de serciorar de que este problema es por culpa de los browsers, voy a postear una FAQ con el script completo (que incluye mayor control de errores, un sistema que permite de cierto modo que no puedan linkearlo desde otras webs, y alguna que otra cosa más.).

Me comprometo a avisar en este post cuando tal FAQ esté hecha.

Saludos y gracias :)
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 10:06.