Ver Mensaje Individual
  #1 (permalink)  
Antiguo 28/05/2006, 18:02
Computer XTress
 
Fecha de Ingreso: diciembre-2004
Mensajes: 721
Antigüedad: 19 años, 3 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");
   }
}
?>